部分class级的“文本秩序”是否正式定义?
具体来说,关于字段初始值设定项(在这种情况下,是静态的) – 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(部分types声明)在组合partial
类时不会评论顺序。 所以; 有什么更强大的,我们可以在这里说,从C#语言规范或从工具文档?
此外,它的行为与csc a.cs b.cs
和csc b.cs a.cs
相似。
下面是C#规范中的另一个代码片段,与您的代码片段一起,似乎解决了这是未定义的行为:
10.2.6成员
[…]types内成员的sorting对C#代码来说很less有意义,但在与其他语言和环境进行交互时可能很重要。 在这些情况下, 在多个部分中声明的types中的成员的顺序是未定义的。
公平地说,它确实很less有意义,不是微不足道的:)。
我知道这个问题很老,但是这里是规范的正确部分:
ECMA-334 (C#语言规范), variables初始值设定项 ,第17.4.5节:
当在同一types的多个部分types声明中有字段声明时,部分的顺序是未指定的。 但是,在每个部分中,字段初始值设定项按顺序执行。
所以部分types的“文本顺序”不是不确定的,而是部分的 。 😉