静态集合是否保证在另一个类使用之前进行初始化/填充?

时间:2016-08-08 18:16:56

标签: c# static

假设我有这两个类:

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是否保证在A类中调用B.GetEntityInfo()之前进行初始化和填充?

2 个答案:

答案 0 :(得分:5)

是的,保证。以下是MSDN的摘录:

  

程序无法准确指定何时加载类。然而,   保证加载并初始化其字段   它的静态构造函数在引用类之前调用   第一次参加你的课程。

编辑:正如所指出的那样,你最终可能会遇到2个静态类相互依赖进行初始化的情况,这可能会让你遇到麻烦,但只要情况不是这样,你就可以了。

答案 1 :(得分:4)

不,如果你有循环依赖关系,那么在该类的静态初始化完成之前,可以从类中运行代码。

以下是初始化为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