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

本文关键字:是否 调用 静态 构造函数 访问 常量 Net | 更新日期: 2023-09-27 17:58:52

下面是我的想法。。。

public class MyClass
{
    public const string MyConstant = "MyConstantValue";
    private static MyClass DefaultInstance;
    static MyClass()
    {
         DefaultInstance = new MyClass();
    }
}
...
NotificationService.RegisterForNotification(MyClass.MyConstant, Callback);

这会起作用吗?还是我需要使用类似static readonly

属性字段的东西来触发静态构造函数?

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

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

您建议的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

静态构造函数从不运行!

在创建第一个实例或引用任何静态成员之前,会自动调用静态构造函数。请参阅此处: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类。在调用需要初始化的东西之前,不会调用静态构造函数。

所以,是的,如果您想确保构造函数被调用,那么您需要访问static readonly之类的东西。

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