给出以下代码:
public static class Helpers
{
private static Char[] myChars = new Char[] {'a', 'b'};
private static Int32 myCharsSize = myChars.Length;
}
是否保证在我使用它的长度分配给之前myChars
将被初始化?myCharsSize
给出以下代码:
public static class Helpers
{
private static Char[] myChars = new Char[] {'a', 'b'};
private static Int32 myCharsSize = myChars.Length;
}
是否保证在我使用它的长度分配给之前myChars
将被初始化?myCharsSize
是的,他们会的,请参阅C# 规范的第 15.5.6.2 条:
类的静态字段变量初始化器对应于一系列赋值,这些赋值序列按照它们在类声明中出现的文本顺序执行(第 15.5.6.1 节)。在部分类中,“文本顺序”的含义由 §15.5.6.1 指定。如果类中存在静态构造函数(第 15.12 节),则在执行该静态构造函数之前立即执行静态字段初始值设定项。否则,静态字段初始化器在第一次使用该类的静态字段之前的依赖于实现的时间执行。
话虽如此,我认为在静态类型初始化程序(静态构造函数)中进行初始化会更好。
嗯......我很惊讶编译(确实如此,我检查过)。我不知道有任何保证可以确保安全。使用静态构造函数...
编辑:我接受(见上面更好的答案)它会起作用;但我对代码的想法是让它尽可能简单和明显。如果不是很明显它会起作用(如果你不得不问它就不可能),那么不要那样写......
特别是依赖字段顺序的问题:
partial
类,它可能会中断我的建议仍然是:在这种情况下使用静态构造函数。
乍一看,我不确定,我不得不尝试一下,看看它是否能编译。
鉴于此,我将在静态构造函数中初始化该值。