C# 静态集合是否保证在其他类使用它之前初始化/填充?

C# 静态集合是否保证在其他类使用它之前初始化/填充?,c#,static,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 cla

假设我有两个类:

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...
    }
}
公共类A,其中T:IEntityWithID,new()
{
私有静态EntityInfo EntityInfo=B.GetEntityInfo(typeof(T));
私有静态IEnumerable测试用例
{
//请使用entityInfo。。。
}
}
专用静态B类
{
私有静态IList entityInfoList=B.GetEntityList();
公共静态EntityInfo GetEntityInfo(类型)
{
返回entityInfoList.Single(e=>e.Types.Contains(type));
}
私有静态IList GetEntityList()
{
//生成EntityInfo的列表。。。
}
}

B类中的entityInfoList是否保证在类A中调用GetEntityInfo()之前初始化和填充?

是,保证。以下是一段来自:

程序无法准确指定加载类的时间。然而, 它保证被加载,并对其字段进行初始化和 在为类引用类之前调用其静态构造函数 第一次在你的节目里


编辑:如前所述,您可能会遇到两个静态类相互依赖进行初始化的情况,这可能会给您带来麻烦,但只要不是这样,您就可以了。

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

下面是一个初始化为
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

Where's
B.GetEntityInfo()
?您没有显示它。添加了B.GetEntityInfo()定义…如何构建
GetEntityList
它是通过使用反射来获取包含IEntityWithID接口的所有类型而构建的。然后,它为每种类型创建一个EntityInfo对象(基本上包含DB实体信息的自定义定义类),并将其添加到列表中。谢谢,这正是我想要的。这是错误的。事实上,在初始值设定项完成之前,可以获取这样一个字段的值。他并没有真正询问是否已完成,只是初始化(并填充)。下面的答案显示它确实被初始化和填充,但有可能会被覆盖(发生之后)。@KeithPayne我演示了在初始化字段之前访问字段的值。我从不覆盖该字段的值。我甚至可以将其标记为
readonly
,它不会更改代码。这里还有一个未涉及的场景。如果构建静态列表的操作发生在一个新线程内部,那么显然不再保证顺序。MSDN文档没有提到这一点。记住这一点很好(不应该被否决),但不能直接回答问题。也许是编辑来解释这是额外的信息?@KeithPayne它怎么不回答这个问题?问题询问是否保证在调用给定方法之前填充值。我演示了如何在调用该方法时使其不被填充,从而证明无法做出保证。我明白你的意思。我没有完全理解你的回答。但这似乎仍然不是百分之百的正确。所讨论的代码不包含循环依赖项。但是在抽象中,这是一个值得关注的问题。@KeithPayne问题中的代码不完整,并且没有提供任何方法的实现。我们不知道它是否有循环依赖关系。考虑到这些方法的实现可能会违反该保证,因此无法做出该保证。