是一个静态集合,保证在另一个类使用它之前被初始化/填充

本文关键字:填充 初始化 另一个 一个 静态 集合 | 更新日期: 2023-09-27 18:01:17

假设我有两个类:

public class A<T> where T : IEntityWithID, new()
{
    private static EntityInfo entityInfo = B.GetEntityInfo(typeof(T));
    private static IEnumerable TestCases
    {
        // Do work with entityInfo...
    }
}
private static class B
{
    private static IList<EntityInfo> entityInfoList = B.GetEntityList();
    public static EntityInfo GetEntityInfo(Type type)
    {
       return entityInfoList.Single(e => e.Types.Contains(type));
    }
    private static IList<EntityInfo> GetEntityList()
    {
       // Builds a list of EntityInfo's...
    }
}

类B中的entityInfoList是否保证在类B之前被初始化和填充?

是一个静态集合,保证在另一个类使用它之前被初始化/填充

是的,这是保证。以下是来自MSDN的一个片段:

程序不能指定类加载的确切时间。然而,它保证被加载并初始化其字段和类引用之前调用它的静态构造函数第一次在你的程序中。

编辑:正如所指出的,你可能会在2个静态类相互依赖的情况下初始化,这可能会给你带来麻烦,但只要不是这种情况,你就没事了。

不,如果你有循环依赖,在类的静态初始化完成之前运行代码是可能的。

下面是一个静态字段初始化为5的简单示例,但是外部类观察到该字段为null:
public class A
{
    public static void Foo()
    {
        Console.WriteLine(B.bar == null);
    }
}
public class B
{
    public static readonly object bar = Foo();
    public static object Foo()
    {
        A.Foo();
        return 5;
    }
}
private static void Main(string[] args)
{
    var bar = B.bar;
}

打印true