Является ли «текстовый порядок» между частичными классами формально определенным? - PullRequest
40 голосов
/ 01 ноября 2011

В частности, в отношении инициализаторов полей (в данном случае, статических) - §17.11 в ECMA 334:

Если класс содержит какие-либо статические поля с инициализаторами, эти инициализаторы выполняются в текстовом порядке непосредственно перед выполнением статического конструктора.

Теперь, если у нас есть несколько классов 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.

Ответы [ 2 ]

20 голосов
/ 01 ноября 2011

Вот еще один фрагмент из спецификации C #, который, взятый вместе с вашим фрагментом, похоже, устанавливает, что это неопределенное поведение:

10.2.6 Члены

[...] Порядок членов внутри типа редко имеет значение для Код C #, но может иметь значение при взаимодействии с другими языками и среды. В этих случаях порядок членов в тип, объявленный в нескольких частях, не определен.

Чтобы быть справедливым, он говорит: редко значительный, а не незначительный:).

5 голосов
/ 01 июня 2017

Я знаю, что этот вопрос очень старый, но вот правильная часть спецификации:

ECMA-334 (спецификация языка C #), Инициализаторы переменных , раздел 17.4.5:

Когда есть объявления полей в нескольких частичных объявлениях типа для одного и того же типа, порядок частей не определен.Однако в каждой части инициализаторы полей выполняются по порядку.

Таким образом, «текстовый порядок» в типах частичный не является неопределенным, скорее это частично определены.; -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...