是“文本顺序”.跨正式定义的部分类

本文关键字:定义 分类 文本 顺序 文本顺序 | 更新日期: 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.cscsc b.cs a.cs相似。

是“文本顺序”.跨正式定义的部分类

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

<

10.2.6成员/strong>

[…类型中成员的顺序很少重要c#代码,但在与其他语言接口时可能很重要和环境。在这些情况下,表示a中成员的顺序

公平地说,它确实说很少重要,而不是不重要:)。

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

ECMA-334 (c#语言规范),变量初始化式, section 17.4.5:

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

所以在部分类型中的"文本顺序"不是未定义的,而是部分定义的。: -)