Tag: typeinitializer

为什么不总是调用值types的构造函数

我有一个值types的types构造函数的问题。 这个问题的启发是杰弗里·里希特(Jeffrey Richter)通过C#第3版在CLR中写的东西,他说(在第195页 – 第8章)你永远不应该在值types中实际定义一个types构造函数,因为有时候CLR不会调用它。 所以,例如(实际上是Jeffrey Richters的例子),即使通过查看IL,我也无法解决这个问题,为什么在下面的代码中没有调用types构造函数: internal struct SomeValType { static SomeValType() { Console.WriteLine("This never gets displayed"); } public Int32 _x; } public sealed class Program { static void Main(string[] args) { SomeValType[] a = new SomeValType[10]; a[0]._x = 123; Console.WriteLine(a[0]._x); //Displays 123 } } 所以,为types构造函数应用下面的规则,我不明白为什么上面的值types构造函数根本不被调用。 我可以定义一个静态值types的构造函数来设置types的初始状态。 一个types只能有一个构造函数 – 没有默认构造函数。 types构造函数是隐式私有的 JIT编译器检查这个AppDomain中是否已经执行了types的types构造函数。 如果不是,则会将调用发送到本地代码,否则不会按照它知道该types已被“初始化”。 所以…我只是不能解决为什么我看不到这种types的数组正在构build。 […]

为什么会find一个types的初始化器抛出一个NullReferenceException?

这让我难住了。 我试图优化一些testingNoda时间,我们有一些types初始值检查。 我想我会找出一个types是否有一个types初始值设定项(静态构造函数或具有初始化的静态variables)加载到一个新的AppDomain 。 令我惊讶的是,尽pipe在我的代码中没有空值,但是对此的一个小testing却抛出了NullReferenceException 。 它仅在编译时没有debugging信息时抛出exception。 下面是一个简短但完整的程序来演示这个问题: using System; class Test { static Test() {} static void Main() { var cctor = typeof(Test).TypeInitializer; Console.WriteLine("Got initializer? {0}", cctor != null); } } 并编辑和输出的抄本: c:\Users\Jon\Test>csc Test.cs Microsoft (R) Visual C# Compiler version 4.0.30319.17626 for Microsoft (R) .NET Framework 4.5 Copyright (C) Microsoft Corporation. All rights reserved. […]