第八章方法(CLR学习)

  实例构造器和类(引用类型)

    构造器是将类型的实例初始化良好状态的特殊方法。构造器方法在"方法定义元数据表"中始终叫做.ctor(constructor的简称);

    创建引用类型的实例时,首先为实例的数据字段分分配呢村,然后初始化对象的附加字段(类型对象指针和同步块索引),最后调用类型的实力构造器来设置对象的初始状态。

    实例构造器永远不能被继承。也就是说,类只有类自己定义的实例构造器。

    类没有显式定义任何构造器,C#编译器将定义为一个默认的(无参)构造器。

    如果类的修饰符为abstract,那么编译器生成的默认构造器的可访问性就为Proteced;

    如基类没有提供无参构造器,那么派生类必须显式调用一个基类的构造器,否则编译器会报错。

    如果类修饰符为staic(sealed和abstract),编译器根本不会在类的定义生成默认构造器。(静态类在元数据中是抽象密封类)

重要提示:不要在构造器中调用虚方法。

  

  实例构造器和结果(值类型)

   值类型(struct)构造器的工作方式与引用类型(Class)的构造器截然不同。CLR总是允许创建值类型的实例,并且没有办法阻止值类型的实例化。

  注意:

    1.结构不能包含显式的无参数构造函数

    2.结构中不能有实例字段初始值设定项

    3.在构造器控制返回到调用方之前,结构的字段必须完全赋值

    4.结构静态构造函数很多时候是不会执行的

  类型构造器(type constructor):可以称为静态构造器(Static constructor),类构造器(Class constructor)或者类型初始化器(Type initializer)

      注意点:

        1.静态构造函数中不允许出现访问修饰符,只能是公共的public

        2.在IL编译器中,类型构造方法总是叫.cctor(代表 Class constructor)

  操作符重载注意点:  关键字operator

  CLR规范要求操作符重载方法必须是public和Static方法。

  如果一个类型定义了操作符重载方法,Microsoft还建议类型定义更友好的公共静态方法,并在这种方法的内部调用操作符重载方法。

  

public sealed class Complex{

      public static Complex operator+(Complex c1,Complex c2){.....} 
     
    
}    

  

  转换操作符方法: 是将一个对象从一种类型转换成另一种类型的方法。

    在inplicit或explicit关键字之后,要指定operator关键字告诉编译器改方法是一个转换操作符。在operator之后,指定对象要转换成什么类型。在圆括号内,指定要从什么类型转换。

 

  扩展方法规则和原则:

    1.C#只支持扩展方法,不支持扩展属性,扩展事件,扩展操作符等

    2.扩展方法(第一个参数前面有一个this的方法)必须在非泛型的静态类中声明。

    3.C#编译器在静态类中查找扩展方法时,要求静态类本身必须具有文件作用域;扩展方法必须在顶级静态类中定义。

    4.由于静态类可以取任何名字,所以c编译器要花一定时间来寻找扩展方法,它必须检查文件作用域中的所有静态类,并扫描它们静态方法来查找一个匹配。

    5.多个静态可以定义相同的扩展方法,如果编译器检测到存在两个或多个扩展方法,就会报异常提示:在以下方法或属性之间的调用不明确

    6.使用这个功能必须谨慎,一个原因是并非所有程序员都熟悉它

    7.扩张方法可能存在版本控制问题。例如Micosoft未来为他们StringBuilder类添加了IndexOf实例方法,而且和我的代码调式一样,那么在重新编译我的代码时,编译器会绑定到Micosoft的IndexOf实例方法,而不是我的静态方法IndexOf方法。

    

原文地址:https://www.cnblogs.com/jzhou/p/4901643.html