English 中文(简体)
在调试和释放构建中初始化
原标题:static field Initialization in debug and release build
  • 时间:2012-05-27 15:45:05
  •  标签:
  • c#

我发现静态字段初始化可以表现不同。 对于以下代码来说,

public class Class1
{
  public static void Main()
  {
    Console.WriteLine("Main");
    Test();
    Console.ReadLine();
  }

  public static void Test(){
    Console.WriteLine("Test");
    Singleton.Instance.DoSomething();
  }
}

public class Singleton
{
  private static Singleton sInstance = new Singleton();

  protected Singleton()
  {
    Console.WriteLine("Singleton Constructor");
  }

  public static Singleton Instance
  {
    get
    {
      return sInstance;
    }
  }

  public void DoSomething(){}
}

在调试构造中,它将打印

Main
Test
Singleton Constructor

发行时, 将打印

Main
Singleton Constructor
Test

I checked the IL code generated of these 2 builds, there are nearly the same.

我想知道这是怎么发生的?如果这是在释放结构中的一种JIT优化,那么动机是什么?

问题回答

< 坚固 > 它完全取决于静态初始化器执行 < / 坚固 > 时的操作。 所以顺序可能不同 。 但如果您提供静态构建器, 这些静态初始化器将总是提前执行。 因此, 输出将按一致的顺序进行 。

发自MSDN

等级的静态字段可变初始化器与在类别声明中出现的文字顺序中执行的指定序列相对应。如果类别中存在静态构建器(第10.11节),则在使用静态构建器之前立即执行静态字段初始化器。 否则,静态字段初始化器是在首次使用该类别静态字段之前一个取决于执行的时间执行的。

http://msdn.microsoft.com/en-us/library/k9x6w0hc.aspx”>静态构建器 在 Singleton 类中添加

static Singleton() { }

我对释放构建中的 x86 音节进行重新处理。 这是设计, 没有固定类构建器运行的保证准确时间, 唯一的要求是在类运行中发生 < em> 之前的 < em > 任何其他方法。 因此, 如果优化器生成了效率更高的代码, 允许它重新排列代码。 它可以将 cctor 调用到主( ) 方法 。 它的好处是它现在有更多机会优化剩余代码 。

一般而言,您要避免在初始化表达式中出现可观察到的副作用的代码。

在 < a href=" "/ a/47934827/147511" > > 另一答案 中,我提供了一个测试程序和讨论,以比较以下各版本的比较: , .NET 主要版本。结果摘要如下;详情请查阅 link :

<强 >.NET2.0/3.5

2.0.50727.8825 x86 Debug
2.0.50727.8825 x86 Debug TouchMe fieldinit
2.0.50727.8825 x86 Release fieldinit
2.0.50727.8825 x86 Release TouchMe fieldinit
2.0.50727.8825 x64 Debug
2.0.50727.8825 x64 Debug TouchMe fieldinit
2.0.50727.8825 x64 Release
2.0.50727.8825 x64 Release TouchMe fieldinit

<强 >.NET 4.7.1

4.7.2556.0 x86 Debug
4.7.2556.0 x86 Debug TouchMe fieldinit
4.7.2556.0 x86 Release
4.7.2556.0 x86 Release TouchMe
4.7.2556.0 x64 Debug
4.7.2556.0 x64 Debug TouchMe fieldinit
4.7.2556.0 x64 Release
4.7.2556.0 x64 Release TouchMe





相关问题
Anyone feel like passing it forward?

I m the only developer in my company, and am getting along well as an autodidact, but I know I m missing out on the education one gets from working with and having code reviewed by more senior devs. ...

NSArray s, Primitive types and Boxing Oh My!

I m pretty new to the Objective-C world and I have a long history with .net/C# so naturally I m inclined to use my C# wits. Now here s the question: I feel really inclined to create some type of ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

How to Use Ghostscript DLL to convert PDF to PDF/A

How to user GhostScript DLL to convert PDF to PDF/A. I know I kind of have to call the exported function of gsdll32.dll whose name is gsapi_init_with_args, but how do i pass the right arguments? BTW, ...

Linqy no matchy

Maybe it s something I m doing wrong. I m just learning Linq because I m bored. And so far so good. I made a little program and it basically just outputs all matches (foreach) into a label control. ...

热门标签