1-字段和方法
2-构造函数和析构函数
3-对象初始化,this,属性,索引器
4-常量,静态构造函数和类,终结器,局部类和方法,nameof
class类-引用类型
字段是1个变量,是class/struct成员
readonly修饰符-防止字段在构造之后被改变
readonly字段只能在声明的时候被赋值,或在构造函数里被赋值
字段的初始化在构造函数之前运行
字段可以可选初始化,未初始化的字段有1个默认值
字段是1个变量
可以同时声明多个字段
1个方法通常只做1件事-单一职责原则
参数由调用者提供
方法的返回
1.通过返回类型返回-返回值/void
2.通过ref/out参数返回
方法签名-方法名和参数列表(和顺序有关)
方法签名与参数名称和返回类型无关
异步编程async
方法结合lambda表达式=>
只适用于单表达式
方法重载-函数名相同,参数列表不同
与参数名称和返回类型无关
参数列表:
含顺序
不含params修饰符
含ref/out-ref和out都是按引用传递-二者不能重复
参数列表相同与否不包含params修饰符
方法是按值传递还是按引用传递的,也是方法签名的一部分
ref/out
2,3相同
ref/out
C#7本地方法
本地方法在另1个方法的方法体内
本地方法不可以使用static修饰符
构造函数-运行class/struct的初始化代码
构造函数和类型名一致,无返回值
字段的初始化在构造函数之前运行
C#7-允许单语句的构造函数写成expression-bodied成员的形式
构造函数的重载
调用重载构造函数时使用this
当同1个类型下的构造函数A调用构造函数B的时候,B先执行
可以把表达式传递给另一个构造函数,但表达式本身不能使用this引用
因为这时候对象还没有被初始化,所以任何方法的调用都会失败
但是可以使用static方法-此时这个方法不是实例的方法,是类型的方法
无参的构造函数
默认构造函数-无参的public构造函数
字段的初始化发生在构造函数执行之前
字段按照声明的先后顺序进行初始化
非public的构造函数-单例模式
constructor构造函数
deconstructor-C#7-作用和构造函数相反,deconstructor会把字段赋给一堆变量
构造函数的方法名必须和类型名相同,无返回值
Deconstructor的方法名只能是deconstructor,有返回值
写法迭代12345
12
3
4
5
deconstructor可以被重载
deconstruct这个方法可以是扩展方法
扩展方法要求为static类里面的static方法
static类命名为Extensions
对象初始化器
如果是无参的构造器-()可以省略
()-构造器
{}-初始化器
编译器对初始化器的处理
有1个临时变量tmp-保证在初始化的过程中出现了异常,那么不会以1个初始化到1半的对象来结尾
在构造函数中使用可选参数
this引用指的是实例的本身
this引用可以让你把字段与本地变量或参数区分开
只有claa/struct的非static成员才可以使用this
属性
字段+get/set方法对=属性
属性是字段的包装器
set-value上下文关键字
属性是字段的包装器
可以保护字段不被非法值污染
只读属性-只有get没有set
只写属性-只有set没有get-less
C#6-get只读属性
C#7-set
自动属性-属性的简化声明prop
属性的完整声明-propfull
C#6-属性简化声明的初始化器
1.=xxx;
2.也可以在构造函数里被赋值
public get
internal/private set
inline-把方法的调用替换成直接展开使用这段代码
索引器-可以按下标访问
实现索引器
使用索引器-读取和赋值
多个索引器
1个类型可以声明多个索引器,它们的参数类型可以不同
1个索引器可以有多个参数
只读索引器-只有get没有set
常量-const
类似于cyy的宏
ex
常量和静态只读字段
静态只读字段场景-当值有可能改变,并且需要暴露给其他assembly时
常量
1.类型的字段
2.本地常量-方法中的常量
静态构造函数
1个类型只能定义1个静态构造函数,并且只执行1次
static修饰,方法名和类型名一致,必须无参
非静态构造函数可以被重载,每个实例执行1次
类型的静态构造函数加载的时机-当类被load时
1.实例化1个类型
2.访问类型的1个静态成员
字段比构造函数先执行
静态字段比静态构造函数先执行
静态字段的初始化顺序和它们声明的顺序一致
静态类
静态类的成员全是静态的
静态类不能有子类
析构函数
在GC回收未引用对象的内存之前运行
C#7
partial type
partial类-允许1个类型的定义分布在多个地方
应用场景-1个类的一部分是自动生成的,另1部分需要手动写代码
每个分布的类都必须使用partial来声明
每个分布类的成员不能冲突,不能有同样参数的构造函数
每个分布类必须在同1个assembly里
如果有父类,可以在1个或多个分布类上指明,但必须一致-因为C#不支持多继承
每个分布类可以独立的实现不同的接口-C#类型只能有1个父类,但可以实现多个基接口
编译器无法保证各分布类的字段的初始化顺序
局部方法
partial类里可以有partial方法-两部分:定义和实现
定义部分通常是自动生成的
实现部分通常是手动编写的
partial方法必须是void,并且是隐式private的
C#6-nameof操作符-重构