【c#基础】ReadOnly、构造函数(this、base)、

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){.....}
原文地址:https://www.cnblogs.com/SignX/p/10969979.html