当前位置:  开发笔记 > 编程语言 > 正文

静态字段初始化如何在C#中工作?

如何解决《静态字段初始化如何在C#中工作?》经验,为你挑选了1个好方法。

是否应在调用构造函数之前完成静态字段初始化?

以下程序提供的输出似乎对我不正确.

new A()
_A == null
static A()
new A()
_A == A

代码:

public class A
{
    public static string _A = (new A()).I();

    public A()
    {
        Console.WriteLine("new A()");
        if (_A == null)
            Console.WriteLine("_A == null");
        else
            Console.WriteLine("_A == " + _A);
    }

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

    public string I()
    {
        return "A";
    }
}

class Program
{
    static void Main(string[] args)
    {
       var a = new A();
    }
}

Reed Copsey.. 28

这是对的.

你的静态初始化器,然后静态构造函数在你的标准构造函数之前运行,但是当它运行时,它使用新的A(),所以通过你的非静态构造函数路径.这会导致您看到的消息.

这是完整的执行路径:

当您第一次调用var a = new A();程序时,这是第一次访问A.

这将触发静态初始化 A._A

此时,A._A构造着 _A = (new A()).I();

这点击

Console.WriteLine("new A()");
if (_A == null)
    Console.WriteLine("_A == null");        

从那时起,_A尚未使用返回的构造类型(尚未)进行设置.

接下来,A { static A(); }运行静态构造函数.这将打印"静态A()"消息.

最后,var a = new A();执行原始语句(),但此时构造静态,以便获得最终打印.



1> Reed Copsey..:

这是对的.

你的静态初始化器,然后静态构造函数在你的标准构造函数之前运行,但是当它运行时,它使用新的A(),所以通过你的非静态构造函数路径.这会导致您看到的消息.

这是完整的执行路径:

当您第一次调用var a = new A();程序时,这是第一次访问A.

这将触发静态初始化 A._A

此时,A._A构造着 _A = (new A()).I();

这点击

Console.WriteLine("new A()");
if (_A == null)
    Console.WriteLine("_A == null");        

从那时起,_A尚未使用返回的构造类型(尚未)进行设置.

接下来,A { static A(); }运行静态构造函数.这将打印"静态A()"消息.

最后,var a = new A();执行原始语句(),但此时构造静态,以便获得最终打印.


A._A的构造发生在静态构造函数中.只是编译器在C#静态构造函数中声明的代码之前预先在静态构造函数(.cctor)中初始化所有字段.
@prankster:我只是想说他的静态构造+初始化都是在他的非静态构造之前发生的。我改写并编辑得更清楚。
推荐阅读
mylvfamily
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有