静态成员对象的初始化c#

3 c# static initialization static-members

我在初始化静态成员对象时遇到了一些问题.在我的项目中有3个类文件:

Feat,Class(RPG风格不是c#类),和Race.

他们每个人都有其可通过例如访问的一些静态成员对象Feat.General.MightyBlow,Race.DwarfClass.Base.Warrior同时MightyBlow.GetType()- > Feat,Dwarf.GetType()- > RaceWarrior.GetType()- > Class.一项壮举可以依赖于其他专长,课程和比赛,同样适用于课程和比赛.这三个类别中的每一个都不是由真正的类/专长/种族引用,而是通过名称字符串引用,该字符串可以在字典中查找,如:Class someClass = Class.Implemented[someClassesName].

一些最小的例子:

public static Feat ArmorHeavy = new Feat(
    "ArmorHeavy",
    Req.Feats(ArmorLight.GetName),
);

public static Feat ArmorLight = new Feat(
    "ArmorLight",
    Req.Feats(),
);
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,首先需要的是ArmorHeavy需求ArmorLight,并且该需求仅通过ArmorLight名称(简称字符串"ArmorLight")来标识.

我没有编译器错误,但运行时我得到以下错误

NullReferenceException:对象引用未设置为对象的实例Feat + Proficiency..cctor()

我认为在ArmorHeavyC#的初始化过程中到达了这个点,在那里ArmorLight.GetName被调用,现在跳转到初始化ArmorLightArmorHeavyArmorLight初始化之后完成.情况并非如此,因为如果我交换这两个成员对象的位置或删除要求,则不会出现错误.

我怎么解决这个问题?请不要告诉我,我必须相应地订购所有专长.

Lao*_*jin 6

您将不得不这样做,无法访问空引用的成员.

但是通过使用静态构造函数可以使它更清晰:

public static Feat ArmorHeavy;
public static Feat ArmorLight;

static ClassName()
{
    ArmorLight = new Feat("ArmorLight", Req.Feats());
    ArmorHeavy = new Feat("ArmorHeavy", Req.Feats(ArmorLight.GetName));
}
Run Code Online (Sandbox Code Playgroud)

请注意,在static ClassNameClassName中是类的真实名称,这些属性在:)中定义

另一种选择是制作它们,Lazy但这可能只是避免正确的初始化顺序太麻烦了.

由于有很多这些东西,所以将这些属性和依赖项移到代码之外可能是个好主意,例如转换为XML:

<Feats>
  <Feat Name="Light" />
  <Feat Name="Heavy" Requires="Light" />
</Feats>
Run Code Online (Sandbox Code Playgroud)

然后编写一些代码来读出XML并初始化对象.

您的实际XML(或其他一些格式)可能需要更复杂,因为可能需要多个依赖项等.

但这一切都取决于你的要求当然......