是“文本顺序”.跨正式定义的部分类
本文关键字:定义 分类 文本 顺序 文本顺序 | 更新日期: 2023-09-27 18:12:53
具体来说,关于字段初始化式(在这种情况下,static) - 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#规范中的另一个代码片段,与您的代码片段一起,似乎解决了这是未定义的行为:
<10.2.6成员/strong>
[…类型中成员的顺序很少重要c#代码,但在与其他语言接口时可能很重要和环境。在这些情况下,表示a中成员的顺序
公平地说,它确实说很少重要,而不是不重要:)。
我知道这个问题很老了,但这是规范中正确的部分:
ECMA-334 (c#语言规范),变量初始化式, section 17.4.5:
当在多个部分类型中有字段声明时对于同一类型的声明,各部分的顺序未指定。但是,在每个部分中都执行字段初始化式秩序。
所以在部分类型中的"文本顺序"不是未定义的,而是部分定义的。: -)