Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.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,我试图理解静态字段到底是什么时候出现的,并且一直在阅读这篇MSDN文章——但它似乎自相矛盾: 首先它说: 在首次访问静态成员之前以及在调用静态构造函数(如果有)之前初始化静态成员。 但它接着说: 如果类包含静态字段,请提供一个静态构造函数,在加载类时对其进行初始化。 所以,我的问题基本上是这样的:静态字段实际上是什么时候初始化的,它们是什么时候第一次出现的?是在调用静态构造函数之前、期间还是之后 非常感谢 静态字段保证在首次使用该类之前初始化 或者,您可以提供一个静态构造函数来在静态初始化发生时

我试图理解静态字段到底是什么时候出现的,并且一直在阅读这篇MSDN文章——但它似乎自相矛盾:

首先它说:

在首次访问静态成员之前以及在调用静态构造函数(如果有)之前初始化静态成员。

但它接着说:

如果类包含静态字段,请提供一个静态构造函数,在加载类时对其进行初始化。

所以,我的问题基本上是这样的:静态字段实际上是什么时候初始化的,它们是什么时候第一次出现的?是在调用静态构造函数之前、期间还是之后


非常感谢

静态字段保证在首次使用该类之前初始化

或者,您可以提供一个静态构造函数来在静态初始化发生时控制它。

它与“普通”字段类似。所以在静态构造函数之前。你可以用一个非常简单的程序来检查

命令如下:

  • 静态场
  • 静态构造函数
  • “正常”字段
  • “正常”构造函数
示例程序:

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Start");
        int b = A.B;
        Console.WriteLine("Read A.B");
        new A();
        Console.WriteLine("Built A");
    }
}

class A
{
    public static int B = mystaticfunc();

    static int mystaticfunc() {
        Console.WriteLine("Static field");
        return 1;
    }

    static A()
    {
        Console.WriteLine("Static constructor");
    }

    int C = myfunc();

    static int myfunc()
    {
        Console.WriteLine("Field");
        return 1;
    }

    public A()
    {
        Console.WriteLine("Constructor");
    }
}
输出:

开始
静电场
静态构造函数
读A.B
领域
建造师
建造一个
C语言规范规定(在
10.5.5.1静态字段初始化中)

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

我相信第二行中的指导实际上是使用字段初始值设定项来初始化未内联完成的静态字段。在这种情况下,您应该使用静态构造函数来保证它们在使用之前被初始化

正如您从规范中所看到的,它们产生的实际“时间”是特定于实现的,并且可能会发生更改。唯一的保证是它们将在调用静态构造函数之前存在,而静态构造函数总是在它们在代码中使用之前存在。本规范规定(见10.12):

静态构造函数的执行由应用程序域中发生的以下第一个事件触发:

·将创建类类型的实例

·引用类类型的任何静态成员


CLR没有静态成员初始化和静态构造函数的单独概念。相反,只有一个类型初始值设定项


C#编译器为您编写这种类型的初始值设定项,首先它初始化静态成员,然后它包含您定义的任何静态构造函数中的代码。

好吧,当妈妈字段和爸爸字段彼此非常相爱的时候……它会异常复杂。有关详细信息,请参见Jon关于该主题的文章: