目录
前言
我所看的书籍,C#图解教程第四版有一些老了,现在C#的最新版本是7,但是这本书挺好的,官网有关于每一个版本更新的要点,https://docs.microsoft.com/zh-cn/dotnet/csharp/whats-new/index
C#4之后增加的是一些更加高级的功能,以后再慢慢了解吧
类的成员
类的成员按照本质来分,有数据成员和函数成员
- 字段
- 常量
- 方法
- 属性
- 构造函数
- 析构函数
- 运算符
- 索引
- 事件
静态成员
- 可以声明为static的类成员如下所示
- 字段
- 方法
- 属性
- 构造函数
- 运算符
- 事件
他们有下面这些性质:
- 静态成员即使没有类的实例也存在 . 如果静态字段有初始化语句,那么该字段在类的任 何静态成员被使用之前初始化,但没必要在程序执行的开始就初始化.
- 静态成员被所有实例共享
- 静态函数可以访问静态字段,但是不能访问实例成员
- 实例成员可以像访问实例成员那样访问静态成员
成员常量
- 成员常量使用修饰符const
- 他在编译期被替换,并没有自己的存储位置
- 他表现的十分像静态字段,即使没有实例,也可以用类名+点+成员常量名字来访问
属性
- 属性是函数成员,拥有set,get两个方法体,但是表现的像字段
- 他没有存储空间
- set方法隐式有一个value参数,和属性类型相同
- 唯一的必须要求是get方法必须要返回一个数据
- set与get很随意,可以对关联字段传进传出,也可以执行任何计算
- 属性可以设置成静态
- 可以只有set或只有get,变成只读属性或者只写属性,必须要有一个进行设定
- 有自动实现属性的方法,编译器会隐式创建后备字段和其关联,但是set,get不能有方法体,以分号结尾。
- 不能显式的调用访问器
- 可以像字段那样,直接引用属性名称
实例构造函数
- 如果没有构造函数,系统会默认有一个无参构造函数,没有方法体
- 构造函数可以重载,只要参数列表不同
- 如果自己为类声明了构造函数,那么系统就不会再提供默认无参构造函数
- 我们可以使用构造函数方法体
- 我们可以给实例构造函数指派访问修饰符,如public,private等,如果是private,则只能在类内部使用该函数。
静态构造函数
- 静态字段通常在静态构造函数中进行初始化
- 或者在静态构造函数中初始化
- 静态构造函数不能有访问修饰符
- 类只能有一个静态构造函数,不能有参数
- 不能在程序中显式调用静态构造函数,他们会被系统自动调用
- 在类的任何实例被创建之前
- 在类的任何静态成员被引用之前
对象初始化列表
- 他只是扩展了创建语法
- 允许在创建新对象实例时,设置字段和属性的值
- 有两种形式
- 初始化发生在构造函数的执行之后,因此会产生不同的值
- 设置的属性和字段必须是可访问的
Myclass ins=new Myclass{FieldOrProp=InitExpr }
Myclass ins=new Myclass(ArgList){FieldOrProp=InitExpr}
析构函数
- 这个函数是用来清理资源的
- 当你觉得自己的程序需要析构函数,你就必须为系统提供他
- 析构函数不能被显式调用,他是被系统在某个不确定的时间点调用,在垃圾收集过程中。
- 每个类只能有一个析构函数
- 析构函数不能有参数,不能有修饰符,名称和普通函数一样,但是多一个‘~’
- 析构函数只对实例起作用,所以没有静态形式
Dispose函数
- 如果想要显式清理资源,就要实现一个IDisposable的接口,把清理资源的代码封装在一个void的无参数方法中,叫做dispose
- 一些指导方针
- 如果dispose已经清理过了,就调用GC.SuppressFinalize 告诉CLR不要再调用析构函数
- 如果某种原因dispose没有清理,就要析构函数来清理
- dispose函数应该属于就算被多次调用也不能出现问题
本地常量
- 常量在声明中必须初始化
- 常量在声明后不能改变
- 在类型之前增加关键字const
- 必须有初始化语句,初始化值必须在编译期决定
- 值可以是null引用或者预定义简单类型的数据或者表达式,不能是引用类型,因为对象的引用在运行时确定的
- 声明在方法体里面
成员常量
- 成员常量和本地常量差不多
- 只是声明在类声明里面
readonly修饰符
- 他的作用和const差不多,但是有稍微不同
- 他可以在声明时就初始化,也可以在类的任何构造函数中进行初始化
- 他在内存中有存储位置
- 他不用在编译期就确定,可以在运行期就确定
class Shape
{
readonly double PI=3.1416;
readonly int NumberOfSides;
public Shape(double side1, double side2)
{
NumberOfSides =4;//在构造函数中确定
}
public Shape(double side1, double side2,double side3)
{
NumberOfSides =3;//在构造函数中确定
}
}
this关键字
- this关键字只能用在下面这些类成员的代码块中
- 实例构造函数
- 实例方法
- 属性或索引的实例访问器
索引
- 索引和属性差不多一样,都有set和get
- 不用分配内存来存储
- 他们都被用来访问其他数据成员,这些成员和它们关联,为这些成员提供设置和获取访问
- 属性表示单独的数据成员
- 索引表示多个数据成员
- 索引可以只有一个访问器,也可以两个都有
- 索引总是实例成员,不能被声明为static
- 和属性一样,set与get访问器可以什么都不做,只要get访问器返回某个指定类型的值即可
- 声明语句
string this [ int index]{}
- 参数列表在方括号中间
- 参数列表至少必须声明一个参数
- 索引没有名称,在名称的位置关键字this
- 索引可以重载,由于名称都是this,所以参数列表必须不一样
访问器修饰符
- 访问器修饰符有很多限制,如下:
- 只有两个访问器都存在的情况下,才可以有修饰符
- 修饰符只能有一个
- 修饰符的等级不能比成员的等级高
- 没有修饰符的访问器继承成员的修饰符
分部类和分部类型
- 类的声明可以被分割成几个分部类的声明
- 每个分部类的声明都含有一些类成员的声明
- 类的分部类声明可以在同一文件中,也可以不在同一文件中
- 局部声明需要被标记
partial class
- partial 是上下文关键字
- 分部类需要在一起进行编译,并且具有相同的含义,如同所有类成员被声明在一个单独的类声明体内
分部方法
- 定义声明和实现声明的签名必须相同
- 定义声明和实现声明在不同的分部类
- 方法返回值为void、不能有修饰符,为隐式私有
- 参数列表不能包含out参数
- 可以有定义部分而没有实现部分,那么对该方法的任何调用将全部删除