代码之家  ›  专栏  ›  技术社区  ›  Nippysaurus

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

  •  1
  • Nippysaurus  · 技术社区  · 15 年前

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

    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);
        }
    
    }
    

    此代码是windows服务(基类中有特定于服务的代码)。由于某些原因,“a”中存储的值在构造函数中始终为空。是有什么明显的原因在做这件事,还是.NET平台中的一个怪癖?

    3 回复  |  直到 15 年前
        1
  •  10
  •   Tim Robinson    15 年前

    交换各国的声明 _instance a Server 构造函数运行得太早。

    作为 const ,将其从构建过程中移除。

        2
  •  5
  •   Jon Skeet    15 年前

    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();
    
        ...
    }
    

    静态字段变量初始值设定项 一个类的类型对应于一系列 它们在文本中出现的顺序 构造函数(§10.12)存在于 类,执行静态字段 执行该静态构造函数。 否则,静态场 执行之前的依赖于实现的时间 那个班。

    我不确定我会不会用这个。。。这太容易打破了。

    你能把它改成常量吗?这将更加有力:

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

    这样一来,如果有人认为重新排序是无害的操作,那么在以后的某个日期再次更改订单就无关紧要了。假设您不知道这里的顺序的重要性,否则您不会问这个问题-您有多愿意打赌另一个查看相同代码的程序员不会有相同的问题?:)

        3
  •  1
  •   Mark Byers    15 年前

    链接: http://msdn.microsoft.com/en-us/library/aa645758%28VS.71%29.aspx

    哦,单身模式通常是反模式。尽可能避免使用它。