标签:c style class blog code java
构造器包括实例构造器(Instance Constructor)和类型构造器(Type Constructor)。它们针对引用类型和值类型拥有不同的行为和准则。
由此可以得出如下推论:
下例代码是针对上述结论和推论的验证:
using System; // 值类型 internal struct SomeValType { // 类型构造器 static SomeValType() { Console.WriteLine("This never gets displayed"); } // 实例构造器 public SomeValType(Int32 x) { m_x = x; } public Int32 m_x; } // 引用类型 internal class SomeRefType { // 类型构造器 static SomeRefType() { Console.WriteLine("This will be display"); } public Int32 m_x; } public sealed class Program { public static void Main() { SomeValType valType = new SomeValType(); valType.m_x = 123; SomeRefType refType = new SomeRefType(); refType.m_x = 456; } }
上述代码执行后输出结果为:
This will be display
很明显,引用类型(SomeRefType)的类型构造器被调用了,因为引用类型的实例被创建了;而值类型(SomeValType)的类型构造器没有被CLR调用,因为值类型的实例构造器没有被调用。正像类型构造器部分第5条所说的那样:“C#并不保证一定会调用它”,这也正符合推论2。
值类型的实例构造器没有被调用的原因就在于Main方法中值类型的实例化代码:
SomeValType valType = new SomeValType();
我们知道,值类型不允许定义默认无参实例构造器,上述代码只是定义一个SomeValType值类型实例并将其全部实例字段初始化为0或null,不会调用任何实例构造器。
如果我们确实希望值类型的类型构造器被调用,那么只需将上述代码修改为:
SomeValType valType = new SomeValType(789);
修改后的代码显式地调用了SomeValType值类型的一个实例构造器,输出结果如下:
This never gets displayed
This will be display
显然,值类型的类型构造器被调用了,因为现在已经符合“对于值类型,当类型的静态成员被访问,或者类型的一个实例构造器被调用时,类型构造器将被调用。”一句中“类型的一个实例构造器被调用”的要求。
上述试验其实又从反方向证明了类型构造器部分的第5条:“C#并不保证一定会调用它”——C#不保证一定会,但也不保证一定不会。
《CLR via C#》精髓:构造器,布布扣,bubuko.com
标签:c style class blog code java
原文地址:http://www.cnblogs.com/xuyanzheng/p/clr-via-csharp-constructors.html