静态字段初始化说明及其要求
本文关键字:说明 字段 初始化 静态 | 更新日期: 2023-09-27 18:33:36
在看了这么多与此相关的复杂问题之后,我想问一下以下代码具有静态字段初始化的解释。 我想知道的另一件事是静态字段初始化的要求。在哪些情况下它会有所帮助??
using System;
class Test
{
static void Main()
{
Console.WriteLine("{0} {1}", B.Y, A.X);
}
public static int F(string s)
{
Console.WriteLine(s);
return 1;
}
}
class A
{
static A()
{ }
public static int X = Test.F("Init A");
}
class B
{
static B()
{ }
public static int Y = Test.F("Init B");
}
输出:
初始化 B
初始化 A
11
当不存在静态构造函数时,输出可能会有所不同。我无法理解其背后的理由。静态字段初始化给这个片段带来了什么不同?有人可以帮忙吗?我是 c# 的新手。
当类型具有静态构造函数时,运行时被约束为在首次使用该类型的任何成员之前立即执行所有类型初始化。
当它没有静态构造函数时,运行时有更多的自由度 - 它必须在首次使用静态字段之前或构造实例之前的某个时间点执行类型初始值设定项,但仅此而已。您甚至可以观察到静态方法,这些方法不涉及在没有执行类型初始值设定项的情况下执行的静态字段。
在您的情况下,A
和 B
都有静态构造函数,对成员的访问顺序首先是 B,然后是 A,因此是您的输出。如果没有这些静态构造函数,您仍然可以保证将"1 1"作为最后一行,并且您仍然可以同时获得"Init A"和"Init B",但无法保证它们的顺序。
这只是指定语言和运行时的方式 - 通常它没有影响,因为通常类型初始值设定项应该只是设置类型,没有其他副作用。理想情况下,类型初始值设定项应尽可能少地执行 - 如果它们由于某种原因失败,则该类型将永远不可用;不会重试类型初始值设定项。
有关更多详细信息,请参阅我的beforefieldinit
文章和 .NET 4.0 类型初始值设定项更改博客文章。