2013-05-25 21 views
1

這是如何評價一樣,什麼流量,實例化和住宅環境中1走

此:

var tag = new TagBuilder("a"); 
tag.MergeAttribute("href", pageUrl(i)); 
tag.InnerHtml = i.ToString(); 

可以變成這樣:

var tag = new TagBuilder("a") 
{ 
    MergeAttribute("href", pageUrl(i)), 
    InnerHtml = i.ToString() 
}; 

是否去:

  1. Instastiates new object
  2. 解析參數並將其設置
  3. 分配所有的值的屬性

有效是否意味着同樣的事情,爲什麼和怎麼樣?

即使沒有"a"被解析,它是否仍然實例化對象並將所有屬性值設置爲默認值?

+4

它只是由編譯器提供的語法糖。結果是100%相同。 –

+1

你的第二個片段不會編譯,你不能從對象初始值設定項調用一個方法。我不知道你爲什麼在談論「解析」,C#不是一種解釋型語言。 – svick

+0

kk感謝您的意見 –

回答

2

這是在規範的§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一個實例如下:

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

其具有作爲

Point __a = new Point(); 
__a.X = 0; 
__a.Y = 1; 
Point a = __a; 
相同的效果

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

1

首先,您不能在對象初始值設定項中調用方法。所以,你可能有這樣的:

var tag = new TagBuilder("a") 
{ 
    // MergeAttribute("href", pageUrl(i)), you can not do this 
    InnerHtml = i.ToString() 
}; 

正如@RadimKohler說,這是一個語法糖,由編譯器提供。你編寫這樣的代碼,編譯時,編譯器會完成剩下的工作。因此,編譯器生成的代碼,你的例子是:

TagBuilder tag = new TagBuilder("a"); 
tag.InnerHtml = i.ToString(); 
// the rest of your code...