2011-11-01 19 views
36

具體而言,相對於字段初始化(在這種情況下,靜態) - §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

很好的問題 –

回答

18

下面是從C#規範的另一個片段,它與您的片段拍攝,似乎解決,這是不確定的行爲:

10.2.6成員

[...]排序類型中的成員對於C#代碼很少有效,但在與其他語言 和環境進行交互時可能很重要。在這些情況下,未定義在多個部分中聲明的 類型內的成員的順序。

爲了公平起見,它說很少顯著,不猥瑣:)。

2

我知道這個問題已經很老了,但這裏是規範的正確部分:

ECMA-334(C#語言規範),變量初始化,部分17.4.5:

當在同一類型的多個部分類型 聲明中有字段聲明時,部件的順序未指定。 但是,在每個部分中,字段初始值設定項的執行順序爲 。

所以「文本順序」在部分類型是不是不確定的,而它的定義部分。 ;-)

相關問題