【问题标题】:Static constructor and inheritance静态构造函数和继承
【发布时间】:2014-06-26 04:07:59
【问题描述】:

我阅读了 Jeffrey Richter - CLR via C# 并决定制作一些测试应用程序。我需要一些帮助来了解究竟发生了什么以及为什么。是的,我知道,公共财产是个坏主意,但我的问题不是关于代码风格。 所以:

class ClassA
{
    public static int val1;

    static ClassA
    {
        val1 = 10;
    }
}

class ClassB : ClassA
{
    public static int val2;

    static ClassB
    {
        val1 = 15;
    }
}

现在我们按以下顺序调用输出到控制台:

Console.WriteLine(ClassB.val1);
Console.WriteLine(ClassB.val2);
Console.WriteLine(ClassB.val1);

输出是:

10
0
15

所以,据我了解,当第一次使用该类型的静态成员时,编译器将调用 static ctor。就在使用之前。 那么为什么它不在第一行调用static ctorClassB 呢?这都是因为静态成员没有继承,所以它只是在第一行调用基类型?请解释一下。谢谢。

【问题讨论】:

    标签: c# .net inheritance constructor static


    【解决方案1】:

    因为第一个调用将在内部转换为Console.WriteLine(ClassA.val1);,这就是调用最初的样子。能够调用ClassB.val1 只是编译器方面的便利。 val1 字段仅与 ClassA 相关,与运行时方面的 ClassB 无关。

    【讨论】:

      【解决方案2】:

      添加到@Euphoric 答案。这是 IL 生成的(由 LinqPAD 显示)

      IL_0001:  ldsfld      UserQuery+ClassA.val1
      IL_0006:  call        System.Console.WriteLine
      IL_000B:  nop         
      IL_000C:  ldsfld      UserQuery+ClassB.val2
      IL_0011:  call        System.Console.WriteLine
      IL_0016:  nop         
      IL_0017:  ldsfld      UserQuery+ClassA.val1
      IL_001C:  call        System.Console.WriteLine
      
      ClassA..ctor:
      IL_0000:  ldarg.0     
      IL_0001:  call        System.Object..ctor
      IL_0006:  ret         
      
      ClassB..ctor:
      IL_0000:  ldarg.0     
      IL_0001:  call        UserQuery+ClassA..ctor
      IL_0006:  ret         
      

      http://share.linqpad.net/a5gjhv.linq

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-11-22
        • 2016-03-24
        • 1970-01-01
        • 2011-12-27
        • 2017-11-17
        • 2020-08-07
        • 2012-09-03
        相关资源
        最近更新 更多