我有一类带有一些静态污秽的东西。初始化它们后,会将其添加到字典中。当程序第二次启动时,它将尝试访问Dictionary的内容,但是由于我尚未访问该类中的任何filds(Dictionary在另一个字典中),因此找不到它们。
我已经了解到,当我访问静态字段时,它们会初始化,但是还有其他方法可以在不调用任何方法或字段的情况下初始化它们,而没有其他原因,然后将它们初始化一次?
感谢您的帮助,指甲。
-------------------这里是一些代码:
Resource.cs
public class Resource : InventoryItem
{
public const int IDBase = 1000000;
private Resource(int id) : base(IDBase + id) { }
public static Resource Hydrogen { get; } = new Resource(1); // H
public static Resource Helium { get; } = new Resource(2); // He
public static Resource Lithium { get; } = new Resource(3); // Li
public static Resource Beryllium { get; } = new Resource(4); // Be
public static Resource Boron { get; } = new Resource(5); // B
public static Resource Carbon { get; } = new Resource(6); // C
public static Resource Nitrogen { get; } = new Resource(7); // N
public static Resource Oxygen { get; } = new Resource(8); // O
// and all the other elements....
}
}
InventoryItem.cs
public abstract class InventoryItem
{
public int ID { get; }
private static readonly Dictionary<int, InventoryItem> idList = new Dictionary<int, InventoryItem>();
public InventoryItem(int id)
{
ID = id;
idList[id] = this;
}
public static InventoryItem GetFromID(int id)
{
return idList[id];
}
}
当我从资源类访问任何内容之前使用InventoryItem.GetFromID(int id)
时,词典为空,无法找到任何内容。如果我在字典中访问任何资源之前。
或者,您可以在静态构造函数中初始化它们。就像默认构造函数一样,它是静态的。它类似于Java的static { ... }
块
public class Resource : InventoryItem
{
public const int IDBase = 1000000;
public static Resource Hydrogen { get; }
public static Resource Helium { get; }
public static Resource Lithium { get; }
// ...
private Resource(int id) : base(IDBase + id)
{
}
private static Resource()
{
Hydrogen = new Resource(1);
Helium = new Resource(2);
Lithium = new Resource(3);
// etc...
}
}
注意-我实际上没有尝试过,但是我认为它可能有效。
由于类中的静态字段仅在首次使用该类时才被初始化,因此您必须以某种方式强制执行此初始化,例如通过调用Resource中的任何静态方法。
示例:
在资源中,添加
public static void Initialize()
{
// can be left empty; just forces the static fields to be initialized
}
以及您项目中的其他地方
Resource.Initialize();
不,没有办法不调用任何方法或字段就对其进行初始化,因为静态类仅在首次访问时初始化,就像实例仅在构造函数调用时初始化。
无论您是否考虑懒惰。
您可以做的是:
例如在程序开始时调用静态类的静态Prepare()
方法。
在程序开始时调用全局准备方法,该方法使用反射在命名空间中查找所有静态类,或者列出所需的类并调用静态构造函数。
How do I invoke a static constructor with reflection?
因此,您可以设计静态类的顺序准备,并在程序启动时或首次使用之前在任何位置指示初始化的顺序。