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操作符-重构











