c# 类型构造器

主要作用是:设置类型中静态字段的初始化。类型构造器不一定要在类中定义,但是最多也只能有一个。例:


代码如下:

class SomeType{
static SomeType(){}
}

jit编译器在编译一个方法时,会查看代码引用哪些类型。任何类型定义了类型构造器,jit编译器都会检查当前AppDomain是否已经执行了这个类型构造器,如果没有就执行,已经执行了就直接返回,不再次执行。在多线程的环境下,可能同一时间有多个执行相同的方法,CLR希望每一个AppDomain中一个类型构造器只执行一次,在调用类型构造器时,使用互斥线程同步锁,解决这个问题。
类型构造器中只能访问类型的静态字段,一般只是初始化这些字段。
代码内联初始化字段:

代码如下:

class SomeType
{
Static int x = 5;
}

等价于

代码如下:

class SomeType
{
Static int x;
Static SomeType()
{
x = 5;
}
}

还有:


代码如下:

class SomeType
{
Static int x = 3;
Static SomeType()
{
x = 5;
}
}

等价于


代码如下:

class SomeType
{
Static int x;
Static SomeType()
{
x = 3;
x = 5;
}
}

虽然c#不允许值类型为它的实例化字段使用内联初始化语法,但是静态字段可以的,以上把class改成struct一样可以运行,

主要原因是:值类型可以定义无参类型构造器,但是不可以定义无参类型实例构造器。

(0)

相关推荐

  • c# 类型构造器

    主要作用是:设置类型中静态字段的初始化.类型构造器不一定要在类中定义,但是最多也只能有一个.例: 复制代码 代码如下: class SomeType{ static SomeType(){} } jit编译器在编译一个方法时,会查看代码引用哪些类型.任何类型定义了类型构造器,jit编译器都会检查当前AppDomain是否已经执行了这个类型构造器,如果没有就执行,已经执行了就直接返回,不再次执行.在多线程的环境下,可能同一时间有多个执行相同的方法,CLR希望每一个AppDomain中一个类型构造器

  • C#小知识之有趣的类型静态构造器

    这是C#中一个有趣的现象,也许您从中可以窥见些许CLR在构造类型时的行为,以及JIT编译的触发式编译过程. 看下面一段代码: 复制代码 代码如下: class Program     {         static void Main()         {             myValueType1 type1 = new myValueType1();             Console.WriteLine(myValueType1.myInt);             Con

  • Swift学习笔记之构造器重载

    与函数一样,方法也存在重载,其重载的方式与函数一致.那么作为构造器的特殊方法,是否也存在重载呢?答案是肯定的. 一.构造器重载概念 Swift中函数重载的条件也适用于构造器,条件如下: 函数有相同的名字: 参数列表不同或返回值类型不同,或外部参数名不同: Swift中的构造器可以满足以下两个条件,代码如下: 复制代码 代码如下: class Rectangle {     var width : Double     var height : Double     init(width : Do

  • c# 所有类型都从Object类型派生

    CLR要求每一个类型都最终从object类型派生,如下: class Typer {} === class Typer :object {} 上面是完全相等的. 所有的类型最终从object派生,每一个类型都有一组最基本的方法: Equals:如果两个对象相等,返回True GetHashCode:返回对象值的一个哈希码 ToString:默认返回类型的完整名称,int等类型被重写 GetType:返回调用的那个对象的类型 此外,从object派生类型能访问受保护的方法 MemberWiseCl

  • 因为一个Crash引发对Swift构造器的思考分析

    前言 不久前,公司决定在一个 Objective-C 老工程中,开始使用 Swift 进行混合开发.期间,碰到一个与 Swift 类构造过程相关的 Crash.在解决的过程中,对 Swift 构造过程有了更深刻的理解,特作此记录,期望对刚入坑 Swift 开发的同学能有所帮助. Crash 回顾 先来看一下代码,以下定义了 BaseiewController 和 AViewController 两个类: // BaseViewController.h #import <UIKit/UIKit.h

  • Python的集合类型之set和frozenset详解

    目录 集合类型—set,frozenset set和frozenset的实例提供以下操作: len(s) xins xnotins isdisjoint(other) issubset(other) issuperset(other) union(*others) intersection(*others) difference(*others) symmetric_difference(other) copy() 可用于set而不能用于不可变的frozenset实例的操作: update(*o

  • Python映射类型之dict详解

    目录 映射类型—dict list(d) len(d) d[key] d[key]=value deld[key] keyind iter(d) clear() copy() classmethodfromkeys(iterable[,value])fromkeys() get(key[,default]) items() keys() pop(key[,default]) popitem() reversed(d) setdefault(key[,default]) update([other

  • 深入浅析javascript继承体系

    最近做web项目,接触了jquery等框架,虽然使用方便,但是还是想学习下Javascript,今天分享下最近对js原型继承的理解,不足之处欢迎指正. 一.构造器的原型属性与原型对象 刚接触js时通常依样画瓢,用函数new一个实例,也不知道其原因,只听说js中函数即对象.原来js中没有采用Java等语言中的类继承体系,而是使用原型对象(prototype)实现继承体系,具体说是利用"构造器"实现类的功能. 首先解释下原型继承中的两个重要概念:原型属性.原型对象(实例). 就js对象系统

  • 详谈.NET的异常处理

    年关将至,对于大部分程序员来说,马上就可以闲下来一段时间了,然而在这个闲暇的时间里,唯有争论哪门语言更好可以消磨时光,估计最近会有很多关于java与.net的博文出现,我表示要作为一个吃瓜群众,静静的看着大佬们发表心情. 以上的废话说的够多了,这里就不再废话了,还是切入正题吧. 在项目开发中,对于系统和代码的稳定性和容错性都是有对应的要求.实际开发项目中的代码与样例代码的区别,更多的是在代码的运行的稳定性.容错性.扩展性的比较.因为对于实现一个功能来说,实现功能的核心代码是一样的,可能只是在写法

  • C#方法的总结详解

    C#方法1:实例构造器和类2:实例构造器和结构3:类型构造器4:操作符重载方法5:转换操作符方法6:扩展方法7:部分方法1:实例构造器和类构造器是允许将类型的实例初始化为良好状态的一种特殊方法,创建一个引用类型的实例时,先为实例的数据字段分配内存,然后初始化对象的附加字段(类型对象指针和同步索引),最后调用构造函数来设置对象的初始状态.构造函数不能被继承,所以不能被virtual.new.override.sealed和abstract修饰,若没有显示定义任何构造函数,编译器将定义一个无参的pu

随机推荐