T1类和对象
1. 面向对象的定义:对事物进行分析和总结,抽象出共同的特征和行为,封装成类,,再把类进行实例化。这种设计思想就叫面向对象。
2. 面向对象的优点:比较灵活、易于维护、可复用、易于扩展
3. 类:具有共同的特征和行为的一类事物的统称
4. 对象:独一无二的,具体指哪一个
T2封装
1. 字段封装成属性:3个步骤
第一步:将字段的public改成private 例如:private int age;
第二步:将字段首字母变成大写 例如:public int Age;
第三步:添加get和set访问器,get用来读取值,set用来设置值得
Private int Age{
get { return age; }
set
{
if (value <0 || value >130)
{
age = 18;
}
}
}
(注:prop按两次tab可直接生成public int MyProperty { get; set;})
2.方法重载:方法名相同,参数的类型不同,或者参数的个数不同
方法重载的作用:少取方法名
3. 构造方法是给属性赋初始值
T3集合类
1. 集合:用来保存数据的。集合可以自动扩容,比数组更灵活
2. Array集合可以保存任何类型的数据(也包含对象),例如:int、string、student
3. ArrayList集合:
添加数据用Add()
删除某个下标的数据:RemoveAt(index),
删除某个元素用:Remove(list[0]),
清空整个集合:Clear();
元素的实际个数:list.Count
元素的容量:Capacity
前三章复习
输出方法:
Console.WriteLine($"姓名:{c1.Name};年龄:{c1.Age};地址:{c1.Address}");
构造函数
在程序中,所有的类都默认有一个无参的构造函数,但是一旦使用了有参的构造函数,那么就需要手动加上无参的构造函数
集合:
变量:可变的量
数组:存储同一类型的数据,致命缺陷是长度固定
集合:长度是可可变的(动态改变),可同时存储不同类型的数据 ArrayList,需要导入命名空间using System.Collections;
字典:key-value键值对
1、prop按两次tab可直接生成构造方法 public int MyProperty { get; set;})
2、prop按两次tab可直接生成私有的构造函数
private int myVar;
public int MyProperty
{
get { return myVar; }
set { myVar = value; }
}
3、cw按两次tab可直接生成 Console.WriteLine();
(1) 输出方式可以用占位符Console.WriteLine("{0}{1}",值1,值2);
(2) 也可用Console.WriteLine($"{值1},{值2}");
4、多行编辑:
(1)按住 Alt 键,使用鼠标拖选
(2)按住 Alt + Shift 键,再按上/下/左/右方向键选择
(3)按住 Ctrl + Alt 键,点击或选择要插入或编辑的位置
3、匹配相同单词并编辑:先选择要编辑的单词或字符,再按一下 Alt + Shift + ;
4、复制行:Ctrl + D
5、注释选定行:Ctrl + K,Ctrl + C(单行注释)Ctrl +Shift+?(多行注释);Ctrl+C(注释)
6、取消选定行的注释:Ctrl + K+ U
7、删除光标右侧的所有字:Ctrl + Delete
8、删除当前行:Ctrl+L
9、展开或关闭当前的代码:Ctrl+M+M
10、切换打开的窗口,即切换各个文件:ctrl+tab
T4 泛型
1. 重载:在同一个类中,方法名相同,参数类型或者个数不同,和返回值类型没有任何关系。
T5类的继承
1、继承是子类可以沿用父类的某些特征和行为,子承父业
2、Public 类名
Public 类名:子类名
3、this和base
this调用本类中的成员属性或者方法
base调用父类中的成员属性或者方法
T6多态
1、方法的隐藏调用的方法,主要是看定义类的等号的左边,也就是引用(在Person p=new Doctor(); Person 类中的方法)
2、方法的重写调用的方法,主要是看定义类的等号的右边,也就是引用(在Person p=new Doctor(); Doctor类中的方法)
即:若为方法的重写,调用哪个方法取决与创建对象,若为方法隐藏,调用哪个方法取决与所使用的引用。
3、虚方法既能隐藏又能重写
4、通过sealed修饰的类称之为密封类,其方法被称为密封方法,由于密封类不能被继承,所有密封类中的方法无法被子类重写,因此,类中的方法不能定义为虚方法。父类使用virtual定义虚方法,子类使用override定义虚方法
5、sealed修饰方法时只能与override一起使用,防止重写的方法再次被重写
6、当设置方法的参数为父类类型时,可接受父类对象以及所有子类对象
7、重载和重写的区别:
重载:在同一个类中,方法名相同,参数类型或者个数不同,和返回值类型没有任何关系。
重写:在父子类中,方法名、参数类型、参数个数、返回值类型要完全相同,并且子类访问修饰符不能低于父类。
T7类的抽象
1、抽象类:不可以包含任何的抽象方法,但是含有抽象方法的类必须定义为抽象类;抽象类不允许有方法体;子类继承于抽象类时必须重写抽象类中的所有的抽象方法,除非子类也是抽象类;抽象类不允许直接实例化,只能实例化其非抽象子类对象。
2、接口分为自定义接口和开发平台提供的接口,若需要对自定义类的对象进行排序,那么该类必须实现IComparable接口
3、自定义接口:
interface 接口名{}
自定义接口要注意:
(1)接口名一般使用大写字母“I”开头,表明它是接口类型
(2)接口可包含方法、属性,但不能包括字段
(3)接口中定义的成员不允许有具体实现,即不能有方法体{}
(4)接口中的成员不允许加任何访问修饰符
(5)接口里的方法在使用接口是必须重写,但是不需要使用override关键字
4、开发平台提供的接口:调用方法: int CompareTo(object obj);返回值得含义为值含义小于零此实例按排序在obj前面,大于零此实例按排序顺序在obj后面,也就是说如果是小于零,那就当前实例要小于object对象,那么如果大于零的话,那么也就是说当前这个实例是大于object对象,即实现比较规则。
5、抽象类体现了一种继承关系;接口则不然,仅仅是实现和被实现的关系。
6、抽象类与接口的运用:在c#中,一个类可以在继承其他类的同时实现多个接口,但是书写时类名在前,接口名在后。
7、在class关键字前添加abstract关键字将类变为抽象类
8、抽象类的特征:
(1)抽象类里可以没有任何属性方法,也可以有具体的方法体{};抽象类不一定要有抽象方法,但是抽象方法必须在抽象类里
(2)抽象类中的抽象方法在子类中必须用override关键字重写
(3)抽象方法不能有方法体{}
(4)抽象类不能通过new关键字实例化对象
9、抽象类一般用于有继承关系的场合,互相之间有一定联系
T8文件操作
1、添加打开文件对话框事件
OpenFileDialog常用属性
FileName:存放的是选中文件的路经
Filter:用来筛选文件的方式,格式是:文本文件|*.txt|所有文件|*.*
FilterIndex:默认选中第几个筛选器
InitialDirectory:打开选择文件对话框默认定位的文件夹位置
Multiselect:多选
2、浏览文件对话框常用属性
Description:对话框左上角提示文字
SelectedPath:存放选中文件夹的路经
RootFolder:对话框打开默认定位地址
ShowNewFolderButton:是否显示新建文件夹按钮
3、文件常用操作方法(要调用这些方法,需要引入命名空间using System.IO;)
使用File.方法名调用,例如:File.Exists(path);
Exists(文件路经):用于检测指定文件是否存在
Copy(源文件路经,复制到的路经):将现有文件复制到新文件中
Move(源文件路经,复制到的路经):将指定文件移动到新位置
Delete(文件路经):删除指定文件
4、文件夹常用操作方法(要调用这些方法,需要引入命名空间using System.IO;)
使用Directory.方法名调用,例如:Directory.Exists(path);
Exists(文件路经):用于检测指定文件夹是否存在
Directory.Move(需移动的文件夹路径,要移动到的文件夹路径):将指定文件移动到新位置
CreateDirectory(路径):在指定路径创建所有目录和子目录
Directory.Delete(路径):删除文件夹,但是文件夹必须为空否则不能删除
Directory.Delete(路径,true):删除文件夹和文件夹里面的所有内容
5、添加创建文件夹事件
(1)选择需要创建文件夹的目录
(2)输入创建文件夹名称
(3)调用Directory.CreateDirectory(路径)
T8 文件操作(二)
文件概念:文件是在各种媒介上存储的数据的有序集合
流的概念:流是一种向存储器读取和写入字节的方式,也是进行数据读写操作的基本对象
文件读写:
1 常用的类 --- FileStream(文件流)、StreamReader(文件读取器)、StreamWriter(文件写入器)
2 文件读写基本步骤
//1 创建文件流
FileStream fs=new FileStream("Path",FileMode.枚举值,FileAccess.枚举值);
//2 创建读写器
StreamReader sr=new StreamReader();
StreamWriter sw=new StreamWriter();
//3 执行读写操作
sr.ReadToEnd(fs);
sw.Write(fs,object)
//4 关闭读写器、关闭文件流
sr.Close();
sw.Close();
fs.Close();
FileMode的枚举值:
CreateNew 创建新文件夹,如果已存在则引发异常
Create 创建新文件夹,如果已存在则覆盖
Open 打开文件,如文件不存在则引发异常
OpenOrCreate 打开文件,如文件不存在则创建新文件夹
Append 打开文件并查找文件尾,如果文件不存在,则创建新文件
Truncate 打开当前文件并清除内容,如果文件不存在则引发异常
FileAccess的枚举值:
Read 对文件进行只读访问
Write 对文件进行只写操作
ReadWrite 对文件进行读写访问
StreamReader的常用方法:
read() 读取输入流
ReadLine() 读取当前流中的一行字符,返回字符串
ReadToEnd() 读取重头到尾的所有字符,返回字符串
Colse() 关闭读取器,释放资源
StreamWriter的常用方法:
Write() 将数据写入流
WriteLine() 将行结束符之前的数据写入流
Colse() 关闭StreamWriter对象和基础流