gpt4 book ai didi

c# - yield return 语句中静态成员的初始化顺序

转载 作者:行者123 更新时间:2023-11-30 14:27:08 25 4
gpt4 key购买 nike

我刚刚注意到通过 yield return 返回的静态成员的初始化不是按照它们被枚举的顺序而是相反的顺序。尽管 C1 实例作为迭代器的第一项返回,但首先创建 C2 实例。如果产生超过 2 个项目,最后一个首先初始化。

public abstract class B
{
private static int _number;

protected B()
{
Number = ++_number;
}
public int Number { get; private set; }
}

class C1 : B
{
public static readonly C1 Default = new C1();
}

class C2 : B
{
public static readonly C2 Default = new C2();
}

public static IEnumerable<B> GetItems()
{
yield return C1.Default;
yield return C2.Default;
}

private static void Main(string[] args)
{
var items = GetItems();

foreach (var item in items)
{
Console.WriteLine(item.Number);
}
}
  • 有没有特殊的原因倒过来?
  • 这是在规范中的某个地方定义的 - 或者它是未定义的并且可能在将来的某个时间更改?
  • 如果这些项目是按照我使用它们的顺序构建的,我会更喜欢。有没有办法确保这一点?

最佳答案

根据问题评论,static initialization is not always deterministic .但是,您可以使用静态构造函数使其具有确定性:

class C1 : B
{
static C1(){}
public static readonly C1 Default = new C1();
}

class C2 : B
{
static C2(){}
public static readonly C2 Default = new C2();
}

这迫使 C1C2 中的每一个都在第一次引用时准确地初始化 - 既不早于也不迟于。 (其中“在第一次引用时”定义为构造实例或访问静态成员。)

如果没有静态构造函数,类型初始化可能会很急(即发生在您首次使用类型之前)或出奇地晚。您可以创建实例,在类型上调用静态和实例方法,但仍然不运行静态字段初始值设定项 - 只有当您引用静态字段时,静态字段初始值设定项必须已经运行。 p>

关于c# - yield return 语句中静态成员的初始化顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33675959/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com