一个类的静态成员表现异常 - 这是怎么可能的?

13

请考虑以下类:

public class MyClass
{
    public static string[] SomeAmazingConsts = { Const1 };
    public static string Const1 = "Constant 1";
    public static string Const2 = "Constant 2";
}

现在,让我们看一下用法:

class Program
{
    static void Main(string[] args)
    {
        string[] s = MyClass.SomeAmazingConsts;
        //s[0] == null
    }
}

问题在于s[0]的值为null!这怎么可能发生?现在,按照以下方式重新排列MyClass的静态变量:
public class MyClass
{
    public static string Const1 = "Constant 1";
    public static string Const2 = "Constant 2";
    public static string[] SomeAmazingConsts = { Const1 };
}

事情开始正常运作。有人能解释一下吗?


你正在将一个空引用赋值给数组,它不可能通过魔法重新分配修改后的值。 - jedgard
1个回答

21

来自10.4.5.1 静态字段初始化

一个类的静态字段变量初始值设定项对应于一系列被执行的赋值,这些赋值按照它们在类声明中出现的文本顺序执行。

因此初始化按从上到下的顺序进行,在第一种情况下,Const1还未被初始化,因此为null


1
那么为什么编译器不会在“public static string[] SomeAmazingConsts = { Const1 };”这一行停止呢?由于Const1是一个静态变量且尚未初始化,它们本可以(?)在其定义之前阻止我使用它。顺便问一下,我该如何确保重新排序不会影响代码执行?有什么建议吗? - Joe Bank
2
我使用 ReSharper ,而该消息(即使只是警告)指出“静态字段初始化程序引用下面或其他部分的静态字段”。所以您可能想考虑使用代码分析工具?此外,您的变量在正确的范围内定义,只是在此时未初始化。 - Adriaan Stander
一个显而易见的解决方案是将字符串数组声明为属性:public static string[] SomeAmazingConsts { get { return new string[] { Const1 }; } } 但这样做可以吗? - Joe Bank
1
这将取决于预期的行为,因为属性将允许对Const1的更改传递到SomeAmazingConsts的引用中,而您当前的设置则不会。 - Adriaan Stander

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接