说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

一小段代码的疑惑

编辑:说三道四文库 发布时间:2018-05-27 04:13
HTML文档下载 WORD文档下载 PDF文档下载
代码如下:

class A
{
    private static int a = 1;

    static A()
    {
        a = 3;
    }

    public A()
    {
        a = 2;
    }

    static void Main(string[] args)
    {
        Console.WriteLine(a);
    }
}


为什么输出是3,程序执行的大概过程如何,请各位大侠赐教,谢谢!
public A()
    {
        a = 2;
    }
这是实例构造函数,显然你根本没有实例化类型A,所以这个构造函数没有其作用,只执行了静态构造函数,所以是3
class A
{
    private static int a = 1; ////////// 【1】

    static A() //////////【2】
    {
        a = 3;
    }

    public A() //////////【3】
    {
        a = 2;
    }

    static void Main(string[] args)
    {
        Console.WriteLine(a);
    }
}

基础的东东,建议楼主认真看看基础。
1、标志【1】【2】处,在第一次调用“类型A”时即会执行;
2、标志【3】处,在“实例化类型A”时即执行(获取一个A类型的实例,比如: A pA = new A(); )

因为你的Main 方法是在 A类型中,调用时默认的是 A.Main()
当第一次使用A.xxx 访问“类型A”时,【1】【2】会执行一次;以后再使用A.xxx时,static 不会再次执行;
而【3】处,每次实例化(调用new A())时,就会执行。

因此,在 A.Main()中访问 a 时,执行的流程为:
【1】->【2】->Main()
再说说:
【2】:类型构造函数
【3】:实例构造函数
引用 2 楼 alonesword 的回复:
class A
{
    private static int a = 1; ////////// 【1】

    static A() //////////【2】
    {
        a = 3;
    }

    public A() //////////【3】
    {
        a = 2;
    }

    static void Main(string[] args)
    {
        Console.WriteLine(a);
    }
}

基础的东东,建议楼主认真看看基础。
1、标志【1】【2】处,在第一次调用“类型A”时即会执行;
2、标志【3】处,在“实例化类型A”时即执行(获取一个A类型的实例,比如: A pA = new A(); )

因为你的Main 方法是在 A类型中,调用时默认的是 A.Main()
当第一次使用A.xxx 访问“类型A”时,【1】【2】会执行一次;以后再使用A.xxx时,static 不会再次执行;
而【3】处,每次实例化(调用new A())时,就会执行。

因此,在 A.Main()中访问 a 时,执行的流程为:
【1】->【2】->Main()

太精辟了,非常感谢,我会努力的!
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘