Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 私有构造函数获取空的私有静态只读字符串_C#_.net - Fatal编程技术网

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

C# 私有构造函数获取空的私有静态只读字符串,c#,.net,C#,.net,我有以下代码。这不是我正在使用的确切代码,因为它是我工作地点的内部代码,而是我遇到的场景的表示 public class Service : ServiceBase { private static readonly Service _instance = new Service(); private static readonly string a = @"D:\test.txt"; private Service () : base() {

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

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服务。基类中有特定于服务的代码。由于某种原因,存储在构造函数中的值在构造函数中始终为空。是否有明显的原因在做这件事,或者这是.NET平台中的一个怪癖?

交换\u实例和a字段的声明。在C语言中,静态字段按声明顺序初始化。换句话说,服务器构造函数运行得太早


或者您可以将a声明为const,这会将其从构造过程中移除。

将_实例和a字段的声明交换。在C语言中,静态字段按声明顺序初始化。换句话说,服务器构造函数运行得太早


或者您可以将a声明为const,这会将其从构造过程中删除。

问题在于,您在运行a的初始值设定项之前调用构造函数,因此您看到了a的默认值。事实上,它不是空字符串-它是空的。您可以通过重新排序来解决此问题:

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

    private static readonly Service _instance = new Service();

    ...
}
静态初始值设定项是以文本顺序运行的,这对于分部类来说有些未定义。根据C3.0规范第10.5.5.1节:

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

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

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

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

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

问题在于,您在运行a的初始值设定项之前调用构造函数,因此看到a的默认值。事实上,它不是空字符串-它是空的。您可以通过重新排序来解决此问题:

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

    private static readonly Service _instance = new Service();

    ...
}
静态初始值设定项是以文本顺序运行的,这对于分部类来说有些未定义。根据C3.0规范第10.5.5.1节:

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

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

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

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

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

静态字段按它们在文本文件中的显示顺序实例化。因此,您的服务是在字符串初始化之前构造的。如果你交换这两行,它应该可以工作

链接:


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

静态字段按照它们在文本文件中出现的顺序进行实例化。因此,您的服务是在字符串初始化之前构造的。如果你交换这两行,它应该可以工作

链接:


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

可能想重命名您的构造函数或可能想重命名您的构造函数或其他人不同意,但这正是我喜欢使用静态构造函数的原因。所有初始化都发生在那里,而不是一些不明显的事情。表演废话废话。。。像这样的一个bug和你获得的所有性能都消失了。在大多数情况下,静态构造函数的性能损失很小。。。这是个不错的选择。无论如何,我更喜欢这里的常量,但是初始化一堆非常量是个好主意
这正是我喜欢静态构造函数的原因。所有初始化都发生在那里,而不是一些不明显的事情。表演废话废话。。。像这样的一个bug和你获得的所有性能都消失了。在大多数情况下,静态构造函数的性能损失很小。。。这是个不错的选择。无论如何,我更喜欢这里的常量,但是初始化一堆非常量是个好主意。