2009-01-30 87 views
23

使用對象初始化程序語法設置屬性的順序是否按照完全相同的順序執行?使用對象初始化程序的操作順序語法

舉例來說,如果我這樣做:

var s = new Person { FirstName = "Micah", 
        LastName = "Martin", 
        IsLoaded = true 
        } 

將每個屬性得到相同的順序設置?

回答

36

是的。

被打斷的道歉(我必須經常每隔一段時間做一些工作)。該規範沒有明確地它,但它使得它非常清楚IMO在第7.6.10.2:


對象初始由成員初始化,由{和}令牌封閉並分離的序列中的由逗號。

(注意這個詞「序列」在這裏,而不是「設置」我個人認爲這是顯著,作爲序列是有序的。)

下面的類代表了兩個座標點:

public class Point 
{ 
    int x, y; 
    public int X { get { return x; } set { x = value; } } 
    public int Y { get { return y; } set { y = value; } } 
} 

點的實例可以被創建和初始化如下:

Point a = new Point { X = 0, Y = 1 }; 

具有相同效果的s

Point __a = new Point(); 
__a.X = 0; 
__a.Y = 1; 
Point a = __a; 

其中__a是否則是不可見且不可訪問的臨時變量。


編輯:我已經從的Mads託格森,誰基本上可以說,任何可以現在已經完成了將保持順序的響應。未來可能會有一些奇怪的地方,那就是在奇怪的情況下,您的訂單不會保存在其他,而不是設置屬性/字段,但這取決於語言的走向。

值得指出的是,實際上有很多步驟正在進行 - 有參數評估(即RHS位)的執行順序和執行任務的順序。例如,如果您有:

new Foo 
{ 
    A = X, 
    B = Y 
} 

以下所有訂單都可能同時仍保持實際財產執行的順序(A和B):

  • 評估X,分配到A,評價Y,分配到B
  • 評估X,評價Y,分配給A,分配到B
  • 評估Y,評價X,分配給A,分配到B

我相信第一個選項是實際採用的選項,但這僅僅是爲了證明除了滿足眼睛外,還有更多。

我也將是非常警惕實際編寫代碼依賴於這個...

+1

好傢伙!你比查克諾里斯好! – Micah 2009-01-30 14:17:36