实例构造器和类型构造器

  实例构造器,新建对象时,设置对象的初始状态,平时接触的比较多,就不多说了。

  类型构造器(静态构造器,类构造器),用来设置类型的初始状态。类型默认没有定义类型构造器,如果定义,也只能定义一个。此外,类型构造器没有参数,代码示例如下:

internal sealed class SomeRefType
{
     static SomeRefType()
     {
          // SomeRefType被首次访问时,执行这里的代码
     }
}

  类型构造器的定义类似于无参的实例构造器,区别在于必须将其标记为static。此外,类型构造器总是私有的,c#会默认将其标记为private。之所以必须私有,是为了阻止任何由开发人员写的代码调用它,对它的调用总是由CLR负责的。

  CLR确保在每个APPDomain中,一个类型构造器只执行一次。为了保证这一点,在调用类型构造器时,调用线程要获取一个互斥线程同步锁。这样一来,如果多个线程试图同时调用某个类型的类型构造器,只有一个线程才可以获得锁,其他线程会被阻塞。第一个线程会执行类型构造器中的代码。当第一个线程离开构造器后,正在等待的线程将被唤醒,然后发现构造器的代码已经被执行过,因此,这些线程将不会再次执行代码,将直接从类型构造器方法返回。除此之外,如果再次调用这样的一个方法(代码所引用的一个类型定义了类型构造器),CLR知道类型构造器已经被执行过,从而确保构造器不被再次调用。

  由于CLR保证一个类型构造器在每个APPDomain中只执行一次,而且是线程安全的,所以非常适合在类型构造器中初始化类型需要的任何单实例(Singleton)对象。可以参考单件模式

时间: 2024-08-26 16:38:04

实例构造器和类型构造器的相关文章

类型构造器与实例构造器

比较实例构造器和类型构造器的区别,类型构造器必须是static,并且不允许定义访问修饰符,类型构造器只能被执行一次.: class mybaseclass { public mybaseclass() { Console.WriteLine("基类实例构造器"); } static mybaseclass()//类型构造器不允许出现访问修饰符 { Console.WriteLine("基类类型构造器"); } public void test()//这里如果是pri

类型构造器-记一次悲惨经历,论我是如何用静态构造器来作死的

在写一个wp的论坛程序时,我定义了几个类.一个是管理类(即Manager),这个管理类不能被实例化,它管理着论坛的板块类型(PlateCategory)和板块(Plate)的集合,即 static PlatesManager() {       //…    private static ObservableCollection<PlateCategory> PlateCategories;         private static ObservableCollection<Plat

008-Scala主构造器、私有构造器、构造器重载实战详解

008-Scala主构造器.私有构造器.构造器重载实战详解 Scala主构造器实战 无参数的主构造器 分析 1.name 需要赋初值,一般通过占位符来代表空值 2.private 声明私有的age 生成的getter/setter方法也是私有的;不加则私有的age生成公有的getter/setter方法 3.private[this] 表示是只属于当前的实例本身,别人无法通过实例访问,也就是说再实例化对象也不可以访问此属性 4.def定义辅助构造器(重载构造器),其他的重载构造器必须调用主构造器

【js实例】Array类型的9个数组方法,Date类型的41个日期方法,Function类型

前文提要:[js实例]js中的5种基本数据类型和9种操作符 Array类型的9个数组方法 Array中有9个数组方法: 1.检测数组 2.转换方法 3.栈方法 4.队列方法 5.冲排序方法6.操作方法 7.位置方法 8.迭代方法 9.归并方法 在实例中介绍,实例如下 /* Array类型 js数组中的每一项可以用来保存任何类型的数据:js数组的大小是可以动态调整的 */ var colors = ["red", "blue", "green"];

神奇的描述符(二):使用描述符实现实例属性的类型检查

因为描述符本身可以接管实例属性的访问,利用这个特点,可以使用描述符来实现一些实例属性的类型检查工作. 先定义一个描述符 Point,用于管理坐标信息. class Point: def __init__(self, name): self.name = name def __get__(self, instance, owner): # 通常情况下,通过类属性访问描述符时,返回描述符自身 if instance is None: return self # 通过实例属性访问描述符时,返回实例 e

类重载类实例或者其他类型的运算符

司空见惯的就是如下: Complex & Complex::operator +(Complex & a) 这样子的类与类之间的运算符重载,而下面的方式 Complex & Complex::operator *(int  a) 可能就少见多怪了! 当然在类外定义友元函数也是简单的: Complex & operator +(Complex & a) 类重载类实例或者其他类型的运算符

扩展方法的几个实例,扩展基本类型、接口、通过反射让扩展方法使用私有成员等

.net扩展方法可以扩展很多类型,包括:基本数据类型.接口.类,等等.如果,需要扩展的类型包含私有成员,扩展方法如何运用这些私有成员呢?本篇逐一体验,包括: ■ 扩展基本数据类型■ 扩展接口■ 扩展包含私有字段的类 使用反射获取类的私有字段■ 扩展一个类的私有嵌套类 通过反射 扩展方法有几个必要前提:● 扩展方法所在的类必须是静态类● 扩展方法本身必须是静态方法● 扩展方法参数中,对类型的扩展参数前必须加this关键字 扩展基本数据类型 针对DateTime类型写一个扩展方法. public s

Scala主构造器和辅助构造器

注:1.本文主要参考自<快学Scala>2.使用jd-gui反编译   Scala的构造方法跟Scala很相似,也可以有任意多的构造器.在Scala中构造器分为主构造器和辅助构造器 在Scala中可以包括一个主构造器和任意多个辅助构造器 主构造器 在Scala中,每个类都有主构造器.而且主构造器的定义是跟类定义交织在一起的. 主构造器的参数是直接放置在类名后面的,如下: class Person(val name:String,val age:Int) { //your code } 主构造器

python类与对象-如何使用描述符对实例属性做类型检查

如何使用描述符对实例属性做类型检查 问题举例 在某些项目中,我们实现一些类,并希望能像静态类型语言那样对它们的 实例属性做类型检查: p = Persosn() p.name = 'tom' #必须是str p.age = 18       #必须是int 要求: (1)可对实例属性指定类型 (2)赋予不正确类型时抛出异常 分析 class A(): pass a = A() #a.x = 'hello' #a.__dict__['x'] = 'hello' a.x = 'hello'等价于a.