zoukankan      html  css  js  c++  java
  • 第八章方法(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方法。

        

  • 相关阅读:
    Windows Svr 2008 Ent R2 性能计数器显示不全
    SQL Server的keepalive
    C语言字符串常见操作-strcpy、strlen、strcat和strcmp实现
    计算机中数据的编码方式
    OC中的排序方法
    关于C语言内存对齐
    C语言内存管理总结-野指针
    Objective-C基础学习笔记(九)-Foundation
    Objective-C基础学习笔记(八)-内存管理-autorelease使用-property创建对象的内存管理-循环引用的内管管理
    Objective-C基础学习笔记(七)-分类-Category-类的本质-load和+initialize方法-SEL数据
  • 原文地址:https://www.cnblogs.com/jzhou/p/4901643.html
Copyright © 2011-2022 走看看