ReadOnly 修饰符:防止字段在构造之后被改变。readOnly字段只能在声明的时候被赋值,或者构造函数中赋值。
字段的初始化在构造函数之前运行。之后在会运行构造函数。
构造函数用于初始化。
class和struct可以重载构造函数。
调用同个类下的重载构造函数时使用this,如果是调用继承的父类的构造函数用base.
如:this
1 public class Person 2 { 3 4 public int age; 5 6 public int year; 7 8 public Person(int age)=>age=age; 9 10 public Person(int age,int year):this(age){year=year} 11 12 }
如:base:
public class Female:Person { public int sex; public Female(int age,int sex) :base(age) { sex=sex; } }
当同一个类型下的构造函数A调用构造函数B的时候,B先执行。被调用方先执行。
可以把表达式传递给另一个构造函数,但表达式本身不能使用this引用,因为这个时候
对象还没有被初始化,所以对象上任何方法的调用都会失败。但是可以使用staitc方法
构造函数和字段的初始化顺序
字段的初始化发生在构造函数执行之前。
字段按照声明的先后顺序进行初始化。
构造函数的调用顺序:先调用System.Object类的构造函数,在按照层次结构
由上向下进行,直到到达编译器要实例化的类为止。
构造函数的修饰符可以是public private protect.
c#7 DECONSTRUCTOR
C#7 引入了deconstructor 模式
作用基本上和构造函数相反,它会把字段反赋给一堆变量
方法名必须是Deconstruct,有一个或者多个out参数。
deconstructor 可以被重载
deconstruct 也可以是扩展方法。
索引器:
索引器提供了一种可以访问封装了列表值或字典值的class/struct的元素的一种自然语法。
语法很像使用数组时的语法。但是这里的索引参数可以是任何类型。
可以使用null条件操作符。
string s=null Console.WriteLine(s?[0]);
实现索引器。
需要定义一个this属性,并通过中括号指定参数。
class test { string[] words="a bc dedfs“.Split(); public string this[int num] { get {return words[num];} set{words[num]=value;} } }
一个类型可以声明多个索引器,他们的参数类型可以不同
一个索引器可以有多个参数
public string this[int arg1,string arg2] { get{.....;} set{....;} }
只读索引器 如果不写set访问器,那么这个索引器就是只读的。
c#6 后都可以使用expression-bodied语法
public string this[int num]=>words[num];
CLR的索引器实现
索引器的内部会编译成get_Item和set_Item方法
public string get_Item(int wordNum){....} public void set_Item(int wordNum,string value){.....}