【发布时间】:2011-11-01 11:36:14
【问题描述】:
具体而言,与字段初始化器(在本例中为静态)有关 - ECMA 334 中的第 17.11 节:
如果一个类包含任何带有初始化器的静态字段,则这些初始化器会在执行静态构造函数之前以文本顺序立即执行。
现在,如果我们在单独的文件中有多个 partial 类,那么该顺序是否在任何地方确定?我的直觉说“没有正式定义,但可能与 csproj 中包含的顺序或 csc 中记录的顺序有关”。这是正确的吗?
(是的,我意识到最好完全避免歧义 - 可能通过将所有初始化移动到静态构造函数)。
例如,如果我有a.cs:
using System;
partial class Program
{
private static int Foo = Write("Foo");
static int Write(string name)
{
Console.WriteLine(name);
return 0;
}
static void Main()
{
Console.WriteLine("[press any key]");
Console.ReadLine();
}
}
和b.cs:
partial class Program
{
private static int Bar = Write("Bar");
}
和:
<Compile Include="a.cs" />
<Compile Include="b.cs" />
那么这是Foo 然后是Bar;但是,如果这是:
<Compile Include="b.cs" />
<Compile Include="a.cs" />
然后是Bar 然后是Foo。这支持观察,但没有强烈说明。 §8.7.13(部分类型声明)对组合partial 类时的顺序不做评论。所以;从 C# 语言规范或工具文档中,我们可以在这里说什么更强大的东西吗?
此外,csc a.cs b.cs 与 csc b.cs a.cs 的行为类似。
【问题讨论】:
标签: c# constructor