实例构造器和类型构造器
2015-06-02 16:45
232 查看
实例构造器,新建对象时,设置对象的初始状态,平时接触的比较多,就不多说了。
类型构造器(静态构造器,类构造器),用来设置类型的初始状态。类型默认没有定义类型构造器,如果定义,也只能定义一个。此外,类型构造器没有参数,代码示例如下:
类型构造器的定义类似于无参的实例构造器,区别在于必须将其标记为static。此外,类型构造器总是私有的,c#会默认将其标记为private。之所以必须私有,是为了阻止任何由开发人员写的代码调用它,对它的调用总是由CLR负责的。
CLR确保在每个APPDomain中,一个类型构造器只执行一次。为了保证这一点,在调用类型构造器时,调用线程要获取一个互斥线程同步锁。这样一来,如果多个线程试图同时调用某个类型的类型构造器,只有一个线程才可以获得锁,其他线程会被阻塞。第一个线程会执行类型构造器中的代码。当第一个线程离开构造器后,正在等待的线程将被唤醒,然后发现构造器的代码已经被执行过,因此,这些线程将不会再次执行代码,将直接从类型构造器方法返回。除此之外,如果再次调用这样的一个方法(代码所引用的一个类型定义了类型构造器),CLR知道类型构造器已经被执行过,从而确保构造器不被再次调用。
由于CLR保证一个类型构造器在每个APPDomain中只执行一次,而且是线程安全的,所以非常适合在类型构造器中初始化类型需要的任何单实例(Singleton)对象。可以参考单件模式。
类型构造器(静态构造器,类构造器),用来设置类型的初始状态。类型默认没有定义类型构造器,如果定义,也只能定义一个。此外,类型构造器没有参数,代码示例如下:
internal sealed class SomeRefType { static SomeRefType() { // SomeRefType被首次访问时,执行这里的代码 } }
类型构造器的定义类似于无参的实例构造器,区别在于必须将其标记为static。此外,类型构造器总是私有的,c#会默认将其标记为private。之所以必须私有,是为了阻止任何由开发人员写的代码调用它,对它的调用总是由CLR负责的。
CLR确保在每个APPDomain中,一个类型构造器只执行一次。为了保证这一点,在调用类型构造器时,调用线程要获取一个互斥线程同步锁。这样一来,如果多个线程试图同时调用某个类型的类型构造器,只有一个线程才可以获得锁,其他线程会被阻塞。第一个线程会执行类型构造器中的代码。当第一个线程离开构造器后,正在等待的线程将被唤醒,然后发现构造器的代码已经被执行过,因此,这些线程将不会再次执行代码,将直接从类型构造器方法返回。除此之外,如果再次调用这样的一个方法(代码所引用的一个类型定义了类型构造器),CLR知道类型构造器已经被执行过,从而确保构造器不被再次调用。
由于CLR保证一个类型构造器在每个APPDomain中只执行一次,而且是线程安全的,所以非常适合在类型构造器中初始化类型需要的任何单实例(Singleton)对象。可以参考单件模式。
相关文章推荐
- python执行子进程实现进程间通信的方法
- jQuery中$.fn的用法示例介绍
- 数值属性的相异性:闵可夫斯基距离
- iOS 调试
- shmget函数与shmat
- 交叉编译 libde265 到arm32位库
- spring 注解 singleton prototype request session global session
- email验证
- chrome使用技巧(看了定不让你失望)
- 设计模式之 - 代理模式
- Android 小米盒子游戏手柄按键捕获 - 能获取到的 home 键依然是个痛
- 什么是LAMP?
- UVA111 LCS
- icvCreateHaarTrainingData和icvCreateBackgroundData
- 交流
- 把二元查找树转变成排序的双向链表
- 从本地相册中动态添加image
- hdu-5246(超级赛亚ACMer)(简单贪心)------2015年百度之星程序设计大赛 - 初赛(1)
- Java-Swing编程之对话框案例详解
- PHP中编译Memcached的扩展