第八章 方法

目录

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

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

8.3 类型构造器

8.4 操作符重载方法

8.5 转换操作符方法

8.6 扩展方法

8.7 分布方法

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

构造器是将类型的实例初始化为良好状态的特殊方法。构造器方法在“方法定义元数据表”中始终叫做.ctor。创建引用类型的实例时,首先为实例的数据字段分配内存,然后初始化对象的附加字段(类型对象指针和同步块索引)。最后调用类型的实例构造器来设置对象的初始状态。构造引用类型的对象时,在调用类型的实例构造器之前,为对象分配的内存总是先被归零。没有被构造器显示重写的所有字段都保证获得0或null值。

实例构造器永远不能被继承,所以实例构造器不能使用以下字符修饰符:virtual,new,override,sealed,abstract。如果没有显示定义任何构造器,C#编译器将定义一个默认(无参)构造器。在它的实现中,只是简单地调用了基类的无参构造器。

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

值类型构造器的工作方式与引用类型的构造器截然不同。CLR总是允许创建值类型的实例,并且没有办法阻止值类型的实例化。所以,值类型其实并不需要定义构造器,C#编译器根本不会为值类型内联(嵌入)默认的无参构造器。

8.3 类型构造器

类型构造器也称为静态构造器,类构造器或者类型初始化器。可用于接口(C#编译器不允许),引用类型和值类型。类型构造的作用时设置类型的初始化状态。类型默认没有定义类型构造器。如果定义,也只能定义一个。此外,类型构造器永远没有参数。

当方法被JIT编译完毕之后,线程开始执行它,最终会执行到调用类型构造器的代码。多个线程可能同时执行相同的方法。CLR希望确保在每个AppDomain中,一个类型构造器只能执行一次。为了保证这点,在调用类型构造器时,调用线程要获取一个互斥线程同步锁。这样一来,如果多个线程试图同时调用某个类型的静态构造器,只有一个线程才可以获得锁,其他线程会被阻塞。第一个线程会执行静态构造器中的代码。当第一个线程离开构造器后,正在等待的线程被唤醒,然后发现构造器的代码已被执行过,因此,这些线程不会再次执行代码,将直接从构造器方法返回。初次之外,如果再次调用这样的一个方法,CLR知道类型构造已被执行过,从而确保构造器不被再次调用。

类型构造器中的代码只能访问类型的静态字段,并且它的常规用途就是初始化这些字段。

类型构造器不应调用基类型的类型构造器,因为类型不可能有静态字段是从基类型分享或继承的。

8.4 操作符重载方法

8.5 转换操作符方法

8.6 扩展方法

8.7 分布方法

猜你喜欢

转载自www.cnblogs.com/terry-1/p/9840345.html