1. 文件的管理(File)
1). 读取文件
->文件的路径
->文件的格式(gb2312、utf-8)
Encoding.Default->应用到文件内容的编码(系统默认编码)
Encoding.GetEncoding("gb2312")->换成国际编码
2). 所有的文件操作都在System.IO里面
->读取全部的文本,返回一个string:ReadAllText
->读取每一行的文本,返回一个string数组:ReadAllLines
->遇到回车将前面的文本作为一项放到数组中
->读取文本内容,将文本内容的每一行作为数组中的一项
->将所有文本读入数组中
3). 写文件使用File方法,当文件不存在时,会自动创建;如果文件操作,会将文件内容覆盖
4). 文件的操作:
->文件操作都要引用System.IO这个命名空间 ,文件操作都在类File中
->读文件
->ReadAllLines(路径,编码格式); ->返回数组,是一行一行的读
->ReadAllText(路径,编码格式); ->返回字符串,换行符是\r\n
->写文件
->WriteAllText(路径,字符串内容,编码格式);
->WriteAllLines(路径,字符串数组,编码格式);
->追加文件 ->APPendAllText
5). 文件管理
->Exist 判存
->Create 创建
->Move 移动
->Cope 复制
->Delete 删除
2. 文件夹的管理(Directory) 文件夹的管理相比文件的管理要简单:
->1)判存
->Directory.Existe(文件夹的路径);返回bool类型
->2)创建
->Directory.CreateDirectory(要创建文件夹的路径);
->3)删除
->Directory.Delete(要删除的文件夹);
->4)移动
->Directory.Move(要移动的文件夹的路径,移到目的地的路径);
3. 问题
不管是文件还是文件夹在移动或复制的时候,可能会遇到同名的情况;或者文件路径没有写全、目标文件夹不存在等问题
例如:将D:\1.txt文件,移到D:\1\1.txt,可能会出现以下问题:
->这样写就造成了文件路径不全:File.Move(@"D:\1.txt", @"D:\1");
->解决方案:补全路径名
->如果D盘没有名字为1的文件,这样写就是目标文件夹不存在:File.Move(@"D:\1.txt", @"D:\1\1.txt");
->解决方案:先创建文件夹1
->如果在1这个文件夹里有1.txt这个文件,还这样写就会异常:File.Copy(@"D:\1.txt", @"D:\1\1.txt");
->解决方案:用try-catch捕获异常;或者把原来的文件覆盖掉:File.Copy(@"D:\1.txt", @"D:\1\1.txt",true );
4. 获得文件夹下的文件与文件夹
获得文件:
->Directory.GetFiles(指定文件夹的路径,*.后缀名(指定的文件类型));返回一个数组,不要第二个参数,则返回所以文件
获得文件夹:
->Directory.GetDirectory(指定文件夹的路径,*.后缀名(指定的文件类型));返回一个数组,不要第二个参数,则返回所以文件夹
用foreach遍历出文件或文件夹的名字:
->foreach(string item in arrayName(返回数组的名字))
{
int index=item.LastIndexOf('\\');
string str = item.Substring(index + 1);
Console.ReadLine(str);
}
5. 多态的实现(难点、重点)
多态的实现有3种方法:
1)类的继承(虚方法) 2)抽象类 3)接口
1)类的继承在前面进过,而继承与里氏转换配合使用也可以实现多态的。在这里简单讲一下里氏转换:a.子类的对象可以隐式转换成父类的对象。例: Student(子类) st=new Student();Person(父类) p=st; b.把父类的对象强转成子类的对象。例:Student st=(Student)p; 使用通过继承和里氏转换也可以实现一个对象表现出多种状态。 ->虚方法:子类中对某一个方法大部分相同,个别不同,在父类中定义虚方法,一样的用继承的,不一样的重写。
->例子:假设所有的人都会走路,并且大部分人都是用2条腿走,只有个别人比如老人(3条腿)、残疾人,所以走路定义在人类中,正常人类的子类 都用父类的走路方法继承就行了,特殊子类如老人类可以重写走路的方法
->关键字用在哪里?
->new 如果子类继承父类,而方法名又相同,在子类的方法中加new则叫显示隐藏基类方法,没有new则叫隐式隐藏基类方法;如果不看父类,则不知道父类中是否有这个方法,或者子类的方法是否是父类的重写和隐藏父类的方法;所以只要加了new就是父类的隐藏方法。如果父类中没有这个方法而又加了new则会警告,这个方法不会隐藏继承的成员,不需要new关键字。所以在这种情况下new就是一个标记,表示子类是否是隐藏基类方法。
->virtual和override virtual是为了让子类重写,所以virtual用在父类里;override表示重写父类方法,所以用在子类中。在父类的方法中加virtual表示 这个方法是虚方法,表示:如果在子类中写了一个同样的方法,在使用时就会调用子类中的方法,而不会调用父类中的这个方法,就是说当子类中没有这个方法时,而又要用这个方法,就会从父类中调用。而override写在子类中时就说明在子类中重写了父类的方法;如果父类中没有写virtual子父类中又写override就会发生异常,2个同样的方法就会冲突,子类中的方法就无法重写。如果父类的方法中写了virtual而子类的方法中没有写override,这种情况是可以发生的,子类一样重写的父类的方法。而如果在子类中使用new关键字的话也是能重写父类方法的。
->public 定义这个类到处可以被访问
->internal 本程序集访问 本项目
->private 只能在本类中访问
->protected 只能在本类和子类中访问
->abstract表示抽象
2)抽象类:他是用于指定蓝图的,是法律的制定者或规划者,是领导,他自己不做,让手下去做,并且手下的能力不同,完成的效果也不同。所以抽象类也可以实现多态。
->抽象方法:指定蓝图用的,用于子类都必须有,但每个子类的方法实现的功能都不同,用这个在父类中限制子类必须有的方法,并且子类实现了自己与本人不同的方法体。 ->例子:所有国家的人都会说话,但每个国家的人说的语言都不一样,所以把说话定义成抽象方法,定义在抽象类人中,在定义每个国家的人类时都必须有说话的方法,并且每个国家都能说自己的语言。
3)接口:个别子类拥有的方法,定义一个功能(接口),谁想拥有这个功能就继承(接口)。
->例子:接口就是一个规范,比如收作业这个功能接口,既不能定义在父类人类中,因为学生要收作业,老师要收作业,但是工程师不需要收作业;而定义在父类中可以用虚方法和抽象方法,子类工程师不需要收作业这个功能,就不能定义在父类中。所以要定义一个接口功能,那么子类谁想用这个接口功能只要继承接口就行了。
4)代码演示:
->抽象类
namespace _03抽象
{
class Program
{
static void Main(string[] args)
{
while (true)
{
Person p = CreatePerson();
p.Say();
Console.ReadKey();
}
}
static Person CreatePerson()
{
//简单工厂模式
Random r = new Random();
int i = r.Next(1, 4);
switch (i)
{
case 1:
return new 中国人();
case 2:
return new 日本人();
default:
return new 韩国人();
}
}
}
abstract class Person
{
string name;
public string Name
{
get { return name; }
set { name = value; }
}
public abstract void Say();
}
class 中国人 : Person
{
public override void Say()
{
Console.WriteLine("中国话");
}
}
class 日本人 : Person
{
public override void Say()
{
Console.WriteLine("日语");
}
}
class 韩国人 : Person
{
public override void Say()
{
Console.WriteLine("韩语");
}
}
}
->虚方法
namespace _04虚方法
{
class Program
{
static void Main(string[] args)
{
Person p;
p = new 成年人();
p.Go();
p = new 老年人();
p.Go();
p = new 脚残疾的人();
p.Go();
Console.ReadKey();
}
}
class Person
{
string name;
public string Name
{
get { return name; }
set { name = value; }
}
public virtual void Go()
{
Console.WriteLine("用脚走路!");
}
}
class 成年人 : Person
{
}
class 老年人 : Person
{
}
class 脚残疾的人 : Person
{
public override void Go()
{
Console.WriteLine("脚残,用手走~!");
}
}
}
->接口
namespace _05接口
{
interface I收作业
{
void 都给我交作业();
}
class Program
{
static void Main(string[] args)
{
}
}
class Person
{
string name;
public string Name
{
get { return name; }
set { name = value; }
}
}
class 老师 : Person,I收作业
{
public void 都给我交作业()
{
Console.WriteLine("都交作业了!");
}
}
class 学生 : Person, I收作业
{
public void 都给我交作业()
{
Console.WriteLine("都交作业了!");
}
}
class 工程师 : Person
{
}
}
多态这一块老师讲的不深,有些地方我的理解可能不对,如果哪位发现了可以评论一下。谢谢!!