Initialization Order of Static Fields in Static Class

北城以北 提交于 2019-11-26 06:37:46

问题


given the following code:

public static class Helpers
{
   private static Char[] myChars = new Char[] {\'a\', \'b\'};

   private static Int32 myCharsSize = myChars.Length;
}

Is it guaranteed that myChars will be initialized before I use its length to assign to myCharsSize?


回答1:


Yes, they will, please see 10.4.5.1 Static field initialization:

The static field variable initializers of a class correspond to a sequence of assignments that are executed in the textual order in which they appear in the class declaration. If a static constructor (Section 10.11) exists in the class, execution of the static field initializers occurs immediately prior to executing that static constructor. Otherwise, the static field initializers are executed at an implementation-dependent time prior to the first use of a static field of that class.

That being said I think it would be better to do the initialization inside a static type initializer (static constructor).




回答2:


Hmm... I'm surprised that compiles (it does, I checked). I'm not aware of any guarantee that would make this safe. Use a static constructor...


Edit: I accept (see better answer above) that it will work; but my idea with code is to keep it as simple and obvious as possible. If it isn't obvious that it will work (and it can't be if you have to ask), then don't write it that way...

In particular, problems with relying on field order:

  • it can break if you move code around (which I often do)
  • it can break if you split the code into partial classes

My advice remains: use a static constructor for this scenario.




回答3:


At first glance, I wouldn't be sure, and I had to try this out to see if it even compiled.

Given that, I would initialize the value in a static constructor.



来源:https://stackoverflow.com/questions/1494735/initialization-order-of-static-fields-in-static-class

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!