为什么访问派生类中的静态成员不会触发派生静态构造函数?

问题描述 投票:0回答:1

我有一组类,它们都应该有一个静态字符串成员。我们将其命名为“TABLENAME”。所有这些类的基类

ClassA<T>
是一个模板类,都有一个名为
TABLENAME
的受保护静态字符串成员。由于 dotnet 处理模板类的静态成员的方式,每个派生类都会获得自己的静态成员实例。此外,每个类都有自己的静态构造函数,用于设置
TABLENAME
。到目前为止一切顺利。

我遇到的问题是双重的。

  1. ClassA
    的子类似乎能够访问其他子类的
    TABLENAME
    。即
    ClassAB
    可以参考
    ClassAC.TABLENAME
  2. ClassAC.TABLENAME
    访问
    ClassAB
    不会触发
    ClassAC
    中的静态构造函数。

是否有任何好的模式可以为一组类提供一组静态成员,其中每个派生类都有自己的一组值,并且在设置这些值之前无法访问这些值。

现在我可以通过向基类添加一个名为

Tablename()
的非静态方法来解决这个问题,该方法返回静态字符串成员
TABLENAME
。在
ClassAB
需要从
TABLENAME
访问
ClassAC
的情况下,我可以创建
ClassAC
的实例并调用
Tablename()
。这将触发
ClassAC
的静态构造函数。我不喜欢这个解决方案,因为您可能会意外地直接访问
ClassAC.TABLENAME
,这将返回 null,因为它不会触发
ClassAC
的静态构造函数。

我想要一组静态成员的原因是我不想在每个派生类中多次初始化这些字段。

想法、想法?

c# static
1个回答
0
投票

根据设计,声明类的静态成员在所有子类之间共享。因此,

TABLENAME
中的
ClassA
静态成员将在其所有子类之间共享。 (来源:https://stackoverflow.com/a/5851501/17985195


为了解决您的问题,

我想要一组静态成员的原因是我不想在每个派生类中多次初始化这些字段。

您可以使用带有初始值的自动属性

因此,在您的派生类中,将您的成员设置为:

public string TABLENAME { get; set; } = "Initial Table Name"; // C# 6 or higher

这样,当实例化该子类时,您的

TABLENAME
字段将使用
"Initial Table Name"
进行初始化,并且您可以使其对每个子类都是唯一的,这本质上就是您想要的。

© www.soinside.com 2019 - 2024. All rights reserved.