gpt4 book ai didi

c# - 确保调用基类的静态构造函数的最佳方法是什么?

转载 作者:IT王子 更新时间:2023-10-29 04:03:32 25 4
gpt4 key购买 nike

documentation on static constructors in C#说:

A static constructor is used to initialize any static data, or to perform a particular action that needs performed once only. It is called automatically before the first instance is created or any static members are referenced.

最后一部分(关于它何时被自动调用)让我陷入了循环;在阅读那部分之前,我认为通过以任何方式简单地访问一个类,我可以确定它的基类的静态构造函数已被调用。测试和检查文档表明情况并非如此;似乎 base 类的静态构造函数不能保证在访问该基类的成员特别是 之前运行。

现在,我想在大多数情况下,当你处理派生类时,你会构造一个实例,这将构成正在创建的基类的一个实例,因此静态构造函数将被调用。但是,如果我只处理 derived 类的 static 成员,那该怎么办?

为了更具体一点,我认为下面的代码可以工作:

abstract class TypeBase
{
static TypeBase()
{
Type<int>.Name = "int";
Type<long>.Name = "long";
Type<double>.Name = "double";
}
}

class Type<T> : TypeBase
{
public static string Name { get; internal set; }
}

class Program
{
Console.WriteLine(Type<int>.Name);
}

我假设访问 Type<T>类会自动为 TypeBase 调用静态构造函数;但事实并非如此。 Type<int>.Namenull , 上面的代码输出空字符串。

除了创建一些虚拟成员(如什么都不做的静态 Initialize() 方法)之外,是否有更好的方法来确保在使用基类型的任何派生类型之前调用基类型的静态构造函数?

如果不是,那么...它是虚拟成员!

最佳答案

您可以显式调用静态构造函数,因此您不必创建任何初始化方法:

System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(typeof (TypeBase).TypeHandle);

可以在派生类的静态构造函数中调用。

关于c# - 确保调用基类的静态构造函数的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4652454/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com