.Net:当一个常量访问时,是否会调用静态构造函数?

时间:2011-06-11 15:25:00

标签: c# static static-constructor

所以这就是我在想的......

public class MyClass
{
    public const string MyConstant = "MyConstantValue";

    private static MyClass DefaultInstance;

    static MyClass()
    {
         DefaultInstance = new MyClass();
    }
}

...

NotificationService.RegisterForNotification(MyClass.MyConstant, Callback);

这是否有效或是否需要使用类似static readonly 属性字段的内容来触发静态构造函数?

4 个答案:

答案 0 :(得分:4)

使用常量不一定会导致成员访问,从而导致调用静态构造函数。允许编译器(鼓励,甚至)在编译时替换常量的值。

static readonly建议的解决方法应该没问题,但readonly建议使用字段,而不是属性。如果属性没有setter,则属性为只读,不涉及readonly关键字。

一个简单的例子:

class HasSConstructor
{
    internal const int Answer = 42;
    static HasSConstructor()
    {
        System.Console.WriteLine("static constructor running");
    }
}

public class Program
{
    public static void Main()
    {
        System.Console.WriteLine("The answer is " + HasSConstructor.Answer.ToString());
    }
}

.NET 4.0下的输出:

  

答案是42

静态构造函数永远不会运行!

答案 1 :(得分:3)

在创建第一个实例或引用任何静态成员之前,会自动调用静态构造函数。见这里:MSDN: Static Constructors

顺便说一句,常量字段本质上是静态的,但如指出的那样,它们可能(并且可能会)被值本身替代。

答案 2 :(得分:1)

如果您只是访问公共常量,则不会调用静态构造函数。例如,考虑这个类:

class Testo
{
    public const string MyValue = "Hello, world";
    public static readonly int xyzzy;

    static Testo()
    {
        Console.WriteLine("In static constructor");
        xyzzy = 27;
    }
}

现在,在另一个类中,执行:

Console.WriteLine(Testo.MyValue);
Console.WriteLine(Testo.xyzzy);

您的输出将是:

Hello, world
In static constructor
27

在编译时从类中提升常量。因此Testo.MyValue的值在运行时不引用Testo类。在调用需要初始化的内容之前,不会调用静态构造函数。

所以,是的,如果你想确保调用构造函数,你需要访问像static readonly这样的东西。

答案 3 :(得分:-1)

不,你不需要这样的。加载类时会调用静态构造函数。