C# 保证静态字段在静态字段初始值设定项中引用之前存在

C# 保证静态字段在静态字段初始值设定项中引用之前存在,c#,static,dependencies,initialization,field,C#,Static,Dependencies,Initialization,Field,问题: Class1.foo1依赖于Class2.foo2,但不能保证它们的编译顺序允许Class1.foo1引用Class2.foo2时初始化Class2.foo2 Class1类 { 静态Foo foo1=新的Foo(“arg1”,Class2.foo2); } 二级 { 静态Foo foo2=新Foo(“arg2”); } 由于创建Class1.foo1时尚未初始化Class2.foo2,因此传递的“Class2.foo2”参数仅为null 我的问题: 是否有一种已知的模式可以处理这种依

问题:
Class1.foo1依赖于Class2.foo2,但不能保证它们的编译顺序允许Class1.foo1引用Class2.foo2时初始化Class2.foo2

Class1类
{
静态Foo foo1=新的Foo(“arg1”,Class2.foo2);
}
二级
{
静态Foo foo2=新Foo(“arg2”);
}
由于创建Class1.foo1时尚未初始化Class2.foo2,因此传递的“Class2.foo2”参数仅为null

我的问题:
是否有一种已知的模式可以处理这种依赖场景,而不需要为每个字段编写详细的初始值设定项?我可以根据需要向Foo类中添加任意多的代码以使其正常工作,因为它只在程序开始时运行一次,我真的很想将其隐藏起来,因为需要编写大量这些字段

我读到的:
我遇到过几个线程在谈论延迟初始化,这听起来很合适,因为它在第一次需要对象时会做一些事情,而且它是特定于字段的,但它会导致难以处理的代码:

static Foo\u otherFoo;
静态Foo其他Foo
{
得到
{
如果(_otherFoo==null)
返回新的Foo(“arg2”);
否则返回_otherFoo;
}
}
我想从carpal tunnel中拯救我的开发伙伴。如果所有这些膨胀都可以隐藏在构造函数后面,那就不会有问题了:

public Foo(参数Foo[]依赖项)
{
如果(依赖项中的任何项)=null
anyItem=new Foo(“参数是在初始值设定项中为每个实例定义的。这里是什么?”);
}
但是我不知道Class2.foo2的初始化参数。由于这只在启动时运行一次,所以我决定将反射作为一个选项,但从我所看到的情况来看,反射不能帮助您识别字段初始值设定项的任何内容,您只能在初始化字段后才能获取其值

类初始化的顺序似乎是由访问的顺序字段决定的:

因此,我运行了一些测试来了解这是如何进行的,它似乎没有停止字段的初始化以初始化它们的依赖项,即Class1.foo1的构造函数必须在Class2.foo2初始化之前完全完成,这意味着Class2.foo2将保持空值

我的问题(再次):

有没有一种已知的模式可以处理这种依赖场景,它不需要为每个字段编写详细的初始值设定项?

,为什么你不能在静态构造函数中这样做,在这里你可以断言顺序?@TheGeneral我编辑了我的问题,让它更清楚:这些字段不能保证在同一个类中,构造函数可以定义它们的顺序。即使如此,静态字段构造函数不应该按行号排序吗?
class1
中引用的
foo2
不是
class2.foo2
。确保粘贴的是可编译代码。”类的静态字段变量初始值设定项对应于一系列赋值,这些赋值按照类声明中出现的文本顺序执行(§15.5.6.1)。在部分类中,“文本顺序”的含义由§15.5.6.1规定。如果静态构造函数(§15.12)存在于类中,则在执行该静态构造函数之前立即执行静态字段初始值设定项。否则,静态字段初始值设定项将在第一次使用该类的静态字段之前的依赖于实现的时间执行。”如果您有多个静态类,那么这将变得更加复杂,类中字段的初始化顺序取决于首先访问的内容。我个人认为你不应该依赖它,它很难维护,而且很容易有人添加字段并犯错误,为什么你不能在静态构造函数中这样做,在这里你可以断言顺序?@TheGeneral我编辑了我的问题,让它更清楚:这些字段不能保证在同一个类中,构造函数可以定义它们的顺序。即使如此,静态字段构造函数不应该按行号排序吗?
class1
中引用的
foo2
不是
class2.foo2
。确保粘贴的是可编译代码。”类的静态字段变量初始值设定项对应于一系列赋值,这些赋值按照类声明中出现的文本顺序执行(§15.5.6.1)。在部分类中,“文本顺序”的含义由§15.5.6.1规定。如果静态构造函数(§15.12)存在于类中,则在执行该静态构造函数之前立即执行静态字段初始值设定项。否则,静态字段初始值设定项将在第一次使用该类的静态字段之前的依赖于实现的时间执行。”如果您有多个静态类,那么这将变得更加复杂,类中字段的初始化顺序取决于首先访问的内容。我个人认为你不应该依赖它,它很难维护,而且很容易有人添加字段并出错