部分类中的"文本顺序"是否正式定义?

Mar*_*ell 40 c# constructor

具体而言,关于字段初始值设定项(在本例中为静态) - 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

并且b.cs:

partial class Program
{
    private static int Bar = Write("Bar");
}
Run Code Online (Sandbox Code Playgroud)

和:

<Compile Include="a.cs" />
<Compile Include="b.cs" />
Run Code Online (Sandbox Code Playgroud)

那么这就是Foo然后Bar; 但是,如果是这样的话:

<Compile Include="b.cs" />
<Compile Include="a.cs" />
Run Code Online (Sandbox Code Playgroud)

那么它是Bar那么Foo.这支持观察,但没有强烈说明.§8.7.13(部分类型声明)在组合partial类时不对顺序发表评论.所以; 我们可以在这里说些什么,无论是来自C#语言规范还是来自工具文档?

此外,它与csc a.cs b.csvs的行为相似csc b.cs a.cs.

Ani*_*Ani 20

这是C#规范中的另一个片段,与您的片段一起使用,似乎解决了这是未定义的行为:

10.2.6会员

[...]类型中成员的排序对C#代码来说很少有意义,但在与其他语言和环境交互时可能很重要.在这些情况下,未定义在多个部分中声明的类型内的成员的顺序.

公平地说,它确实说很少有意义,而不是无关紧要:).

  • “类型中成员的顺序对于 C# 代码来说很少很重要” - whaaaa?不!当涉及到字段初始化顺序时,它非常重要,尤其是当一个“静态只读”字段基于另一个静态字段进行初始化时。 (3认同)

Ano*_*ken 5

我知道这个问题很老,但这是规范的正确部分:

ECMA-334(C#语言规范),变量初始值设定项,第17.4.5节:

当同一类型的多个部分类型声明中有字段声明时,各部分的顺序未指定。但是,在每个部分中,字段初始化程序都是按顺序执行的。

因此,部分类型中的“文本顺序” 不是未定义的,而是部分定义的。;-)