1.文件流(操作文件有一个流程。从打开,到输入数据,到关闭之间有一系列的流程,这期间的操作叫做文件流)
- 小文件用读写用File,大文件读写用FileStream
- Stream(所有流的父类,是一个抽象类)
Filestream fs =File.Open(); //返回FileStream
- 文件操作的类都在Systm.IO;
- 用Using,就不用释放文件,关闭文件操作了,内包含了
using(FileStream fs=new FileStream(path,FileMOde.Open,FileStream.Read,FileShare.Read))//读大文件
读大文件代码
using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read)) //因为要操作文件,需要一个流程,所以在这里面写下流程,使用using的好处是不用写释放文件和关闭文件,因为它是自动关闭的
{
using (StreamReader sr = new StreamReader(fs, Encoding.Default)) //实例化这个,然后用ANSI方式读取
{
while (!sr.EndOfStream) //如果这个流不是在末尾就执行下列代码
{
Console.WriteLine(sr.ReadLine());
}
//Console.WriteLine(sr.ReadLine()); //读一行,经常使用这个,因为修改内容好修改
Console.WriteLine(sr.ReadToEnd()); //读到文件中内容的最后
}
Console.ReadKey();
写大文件代码
//写入大文件
string path = @"F:\提高班\项目\计算机项目\vb项目\CS学习\02 C#\文件练习文件夹\读大文件练习\大文件.txt";
using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Write, FileShare.Write))
{
using (StreamWriter sw = new StreamWriter(fs, Encoding.Default))
{
sw.Write("哈哈"); //这个写入会覆盖掉原来的相同下标的文字
}
Console.ReadKey();
}
多态
第一种(隐藏基类方法与多态的实现)
(多个对象可以表现多个类型的能力--例如人类会说话say,但是老师说的话和学生说的话不一样,可以用多态实现,不同人说不同的话,不同的人还能做不同的运动,在运动中又有不同的技巧)
重写:不同对象对于同一个方法调用的不同行为(指不同对象收到相同消息时,会产生不同行为)
虚方法:用virtual修饰的方法叫做虚方法,虚方法可以在子类中通过override关键字来重写,常见虚方法:ToString()Equals
所有类的方法都是object,例如person后面没有写继承的父类,但是默认的父类为object类
- 子类可以有与父类方法名相同的方法
- 签名不同(重载不同)
- 签名相同(隐藏基类方法)
- 子类可以重写父类方法
- 虚方法
- 重写方法
- 重写积累方法一样可以调用基类方法
隐藏基类的方法
1.可以在子类方法的修饰符后面加new可以解决(重新实例化了)
public class person //重新实例化了此方法
{
public void say()
{
Console.WriteLine("我是人");
}
}
public class student:person
{
public new void say()
{
Console.WriteLine("我是老师");
}
}
2.可以在父类的方法的修饰符后面加 Virtual(虚方法),在子类中方法的修饰符后面加override(重写父类的方法)
public class person //根据具体的人用同样的方法,显示不同的内容
{
public virtual void say()
{
Console.WriteLine("我是人");
}
}
public class student:person
{
public override void say()
{
Console.WriteLine("我是老师");
}
}
虚方法与重写
1.方法不能用static修饰
2.方法重写与基类的签名必须一致
3.virtual不能与private一起使用
第二种(抽象方法与抽象类)
- 抽象类与抽象方法有abstract修饰
- abstract的使用注意
- 抽象方法没有方法体
- 抽象成员只能存在于抽象类中
- 抽象类可以有非抽象成员
- 抽象类的派生类必须实现抽象方法体
- 抽象类只能用作基类,无法实例化
抽象方法与抽象类代码
public abstract class Animal //抽象类
{
public abstract void Shout(); //抽象方法,没有方法体
}
虚方法和抽象方法比较
虚方法 | 抽象方法 |
用virtual修饰 | 用abstract修饰 |
要有方法体 | 不允许有方法体 |
可以被子类override | 必须被子类override |
处理密封类都可以写 | 之恩呢在抽象类中 |
多态小结:
几种建立多态的方式
- 用父类实现多态
- 用抽象类实现多态
- 用接口实现多态
版本控制
- 需要保留基类方法使用new关键字
- 需要重写方法时使用override关键字
设计模式
(设计模式时软件开发过程中经验的基类,根据特定问题可以找到很好的特定解决方法,可以省去很多反复的工作)
接口
- 定义:interface关键字,接口中可以有属性、方法(未实现)
- 街廓的名称通常以“I”开头,入IList
- 如果一个类即继承了类又实现了接口,那么类必须写在前面
- 一个类只能继承一个父类,但可以实现多个接口
class Student:Person,Iwalk,Isay,Imove
- 接口是一种完全抽象的一种约定,接口就是用来实现的,不用就不要定义接口,实现也必须在一定的范围内使用
- 实现接口,不能说继承接口
- 代码例子
namespace 接口 //先添加个接口,在接口窗口中写入接口
{
interface IFly
{
void IFly();
}
}
class Program
{
static void Main(string[] args)
{
IFly ifly = new Teacher();
ifly.IFly(); //调用ifly的IFly方法
Console.ReadKey();
}
}
public class person
{
}
public class Teacher:person,IFly
{
public void Say()
{
Console.WriteLine("我是老师");
}
public void IFly() //接口方法的具体实现
{
Console.WriteLine("我会飞");
}
}
C#中的接口和类有什么异同点
不同点:
- 不能直接实例化接口(?)
- 接口不包含方法的实现
- 接口可以多继承,类只能单继承
- 类定义可在不同的源文件之间进行拆分
相同点
- 接口、类和结构都可以从多个接口继承
- 接口类似于抽象基类:继承接口的任何非抽象类型都必须实现接口的所有成员
- 接口和类都可以包含事件、索引器、方法和属性
C#支持多重继承么?
类之间不支持,接口之间支持。类对接口叫做实现,不叫继承。类是爹,接口是能力,能力有多个能力,但不能有多个爹
抽象类和接口有什么区别?
相同点:
都不能被直接实例化,都可以通过继承实现其抽象方法
不同点:
接口支持多继承;丑行类不能实现多继承
接口只能定义行为;抽象类既可以定义行为,还可能提供实现
接口可以用于支持回调(CallBack);抽象类不能实现回调,因为继承不支持。
接口值包含方法,属性,索引器,事件的签名,但不能定义字段和包含实现的方法;抽象类可以定义字段、属性、包含有实现的方法
接口可以作用于值类型(Struct)和引用类型(Class);抽象类只能作用于引用类型。例如,Strct就可以继承接口,而不能继承类;
装箱与拆箱
装箱:值类型变成引用类型
拆箱:引用类型变成值类型
序列化
将所有数据都转换为了二进制
异常处理
int num = 10;
Console.WriteLine("输入数字");
try
{
int numbner = Convert.ToInt32(Console.ReadLine());
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.ReadKey();
索引器
- 为了方便将类、结构或接口当作数组来使用
- 索引器用于封装内部集合或数组
- 索引本质就是属性
- 利用索引可以用key得到项,亦可用项得到序号
静态方法和实例方法(定义和调用)
静态 | 实例(非静态) |
static关键字 | 不需要static关键字 |
使用类名调用 | 使用实例对象调用 |
在静态方法中,可以访问静态成员 | 在实例方法中:可以直接访问静态成员 |
在静态方法中,不可以直接访问实例成员 | 在实例方法中:可以直接访问实例成员 |
调用前初始化 | 实例化对象时初始化 |