私有构造函数获取空私有静态只读字符串

Nip*_*rus 1 .net c#

我有以下代码.这不是我使用的确切代码,因为它是我工作地点的内部,但它是我遇到的场景的代表.

public class Service : ServiceBase
{

    private static readonly Service _instance = new Service();

    private static readonly string a = @"D:\test.txt";

    private Service () : base()
    {
        // the value stored in "a" is always blank.
        Console.Writeline(a);
    }

    static void Main(string[] args)
    {
        Run(_instance);
    }

}
Run Code Online (Sandbox Code Playgroud)

此代码是一个Windows服务(基类中有特定于服务的代码).由于某种原因,存储在"a"中的值在构造函数中始终为空.有没有明显的东西在做这个,或者它是.NET平台中的怪癖?

Tim*_*son 10

交换_instancea字段的声明.在C#中,静态字段按声明的顺序初始化.换句话说,您的Server构造函数运行得太早.

或者您可以声明aconst,将其从构造过程中删除.


Jon*_*eet 5

问题是您在a运行初始化程序之前调用构造函数,因此您将看到默认值a.事实上,它不是空白(空字符串) - 它是null.您可以通过重新排序解决此问题:

public class Service : ServiceBase
{
    // Initialize a first
    private static readonly string a = @"D:\test.txt";

    private static readonly Service _instance = new Service();

    ...
}
Run Code Online (Sandbox Code Playgroud)

静态初始值设定项以文本顺序运行(对于部分类,它有些未定义).从C#3.0规范的10.5.5.1节:

类的静态字段变量初始值设定项对应于以它们出现在类声明中的文本顺序执行的赋值序列.如果类中存在静态构造函数(第10.12节),则在执行该静态构造函数之前立即执行静态字段初始值设定项.否则,静态字段初始化器在第一次使用该类的静态字段之前的实现相关时间执行.

我不确定我会用那个......但它太容易打破了.

你能把它改成const吗?那将更加强大:

    private const string a = @"D:\test.txt";
Run Code Online (Sandbox Code Playgroud)

这样,如果有人在以后再次更改订单,那就认为重新排序是无害的操作.据推测,你不知道订单在这里的重要性,否则你不会问这个问题 - 你是否愿意赌博另一个看同一代码的程序员不会有同样的问题?:)