3
有誰知道C#編譯器在底層使用下面的代碼做什麼?當使用數組初始化語法初始化C#上的Dictionary實例時,發生了什麼?
dict = new Dictionary<int, string>()
{
{ 1, "value1" },
{ 2, "value2" }
}
目前尚不清楚,如果它創建KeyValuePair實例並調用Add方法,或做一些更優化。你們有誰知道嗎?
有誰知道C#編譯器在底層使用下面的代碼做什麼?當使用數組初始化語法初始化C#上的Dictionary實例時,發生了什麼?
dict = new Dictionary<int, string>()
{
{ 1, "value1" },
{ 2, "value2" }
}
目前尚不清楚,如果它創建KeyValuePair實例並調用Add方法,或做一些更優化。你們有誰知道嗎?
它會作爲參數與值調用對象的方法Add
:
var __temp = new Dictionary<int, string>();
__temp.Add(1, "value1");
__temp.Add(2, "value2");
dict = __temp;
名稱Add
被硬編碼(在C#規範規定:7.5.10.3:集合初始化) 。該方法的參數數量不受限制。它只需要匹配方法的參數數量。可以像那樣使用提供Add
方法的任何集合(實現IEnumerable
接口)。
爲了進一步說明,不,編譯器並不在乎該類是否爲Dictionary
來創建KeyValuePair
並將其傳遞給Add
。它只是生成一個調用Add
方法的序列,在每個調用中傳遞每個集合項中的所有參數。其餘的方法由Add
方法負責。
這裏有一個非常輕微的修正 - 直到所有添加調用之後,才分配變量。基本上就好像有一個臨時變量。這是一個挑剔的問題,但是,嘿,我們要在這裏討論這個問題:)(儘管這不值得單獨回答。)您可能還想提及集合必須實現IEnumerable,儘管沒有對'GetEnumerator()'的調用。 – 2010-05-25 22:01:07
更有趣的背景信息在這裏:http://blogs.msdn.com/b/madst/archive/2006/10/10/what-is-a-collection_3f00_.aspx – LukeH 2010-05-25 22:01:25
@Jon:關於訂單的有趣的觀察。固定。謝謝。也增加了'IEnumerable'要求。 – 2010-05-25 22:06:59