C#可以自动解决静态数据成员之间的依赖关系吗?
-
19-09-2019 - |
题
如果一个静态数据成员取决于另一个静态数据成员,则c#/。净保证依赖静态成员在依赖成员之前初始化?
例如,我们有一个类似:
class Foo
{
public static string a = "abc";
public static string b = Foo.a + "def";
}
什么时候 foo.b 是否访问,总是“ abcdef”还是可以是“ def”?
如果不能保证这一点,是否有更好的方法来确保首先初始化的成员?
解决方案
如前所述,静态字段初始化是确定性的,并且根据文本声明顺序进行。
以此为例:
class Foo
{
public static string b = a + "def";
public static string a = "abc";
}
foo.b将始终导致“ def”。
为此,当静态字段之间存在依赖性时,最好使用静态初始器:
class Foo
{
public static string b;
public static string a;
static Foo()
{
a = "abc";
b = a + "def";
}
}
这样,您明确表示对初始化顺序的关注;或对此事的依赖性(即使您不小心交换初始化语句,编译器将无法提供帮助。)以上将在A和B中存储的预期值(分别为“ ABC”和“ ABCDEF”)。
但是,对于在多个类中定义的静态字段的初始化可能会变得扭曲(和实现)。这部分 10.4.5.1静态字段初始化 语言规范的内容更多。
其他提示
它将显示“ ABCDEF”,因为初始化在源头上排名第一,就像以前一样。
所有静态成员将在持有它们的ClasStype加载后初始化。
不隶属于 StackOverflow