3 c# static initialization static-members
我在初始化静态成员对象时遇到了一些问题.在我的项目中有3个类文件:
Feat,Class(RPG风格不是c#类),和Race.
他们每个人都有其可通过例如访问的一些静态成员对象Feat.General.MightyBlow,Race.Dwarf或Class.Base.Warrior同时MightyBlow.GetType()- > Feat,Dwarf.GetType()- > Race和Warrior.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被调用,现在跳转到初始化ArmorLight并ArmorHeavy在ArmorLight初始化之后完成.情况并非如此,因为如果我交换这两个成员对象的位置或删除要求,则不会出现错误.
我怎么解决这个问题?请不要告诉我,我必须相应地订购所有专长.
您将不得不这样做,无法访问空引用的成员.
但是通过使用静态构造函数可以使它更清晰:
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(或其他一些格式)可能需要更复杂,因为可能需要多个依赖项等.
但这一切都取决于你的要求当然......
| 归档时间: |
|
| 查看次数: |
1067 次 |
| 最近记录: |