.Net:访问常量时会调用静态构造函数吗?

问题描述

| 所以这就是我在想...
public class MyClass
{
    public const string MyConstant = \"MyConstantValue\";

    private static MyClass DefaultInstance;

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

...

NotificationService.RegisterForNotification(MyClass.MyConstant,Callback);
这项工作还是我需要使用诸如
static readonly
属性字段之类的东西来触发静态构造函数?     

解决方法

        使用常量不一定会导致成员访问,这会导致调用静态构造函数。允许编译器在编译时(鼓励,甚至)替换常量的值。 建议您使用
static readonly
的解决方法,尽管
readonly
表示一个字段,而不是一个属性。如果属性没有设置器,则属性为只读,不包含
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 静态构造函数永远不会运行!     ,        在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数。参见此处:MSDN:静态构造函数 顺便说一句,常量字段本质上是静态的,但正如指出的那样,它们可以(并且可能会)被值本身替换。     ,        如果您仅访问公共常量,则不会调用静态构造函数。例如,考虑此类:
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
类。在调用需要初始化的内容之前,不会调用静态构造函数。 因此,是的,如果要确保调用构造函数,则需要访问类似ѭ1的内容。     ,        不,您不需要这样。加载类时将调用静态构造函数。