2013-08-21 240 views
2

任何人都可以解釋,爲什麼我必須使用這種代碼模式?C#初始化數組

// Create the array to store the CDs. 
    CD[] cdLibrary = new CD[20]; 

    // Populate the CD library with CD objects. 
    for (int i=0; i<20; i++) 
    { cdLibrary[i] = new CD(); } 

我不明白爲什麼當我打電話new CD[20]不會發生對象的數組初始化。看起來我正在編寫多餘的代碼。其中一個步驟可以跳過嗎?

+0

你可能想要考慮使用列表而不是數組:http://stackoverflow.com/questions/434761/array-versus-listt-when-to-use-這個 – User

回答

8

我不明白爲什麼數組中的對象的初始化不在運算符new中執行。

你的意思是這條線嗎?

CD[] cdLibrary = new CD[20]; 

20個初始化對象。它初始化數組,只有數組 - 數組有20個元素,每個元素的值爲null(空引用),以開頭。這就像用給定數量的空白頁面創建一本書一樣;如果你想要頁面包含信息,你必須分別寫每個頁面,這是後面的循環所做的。


我假設CD是類類型這裏,爲了簡單起見。

+0

我可以猜出來。但是爲了什麼?爲什麼不簡單?因爲當我更正代碼(我不知道它是在msdn中)時,我決定我犯了一些錯誤,像這樣寫代碼。也許這是哲學的問題...... –

+3

@ so-olitary:那麼你建議語言應該自動*通過調用類'n'次的無參數構造函數來填充數組?如果*是*沒有無參數構造函數呢?或者如果我想以不同的方式實際填充它(例如,使用與以前相同的循環,但在每次迭代中將'i'作爲參數傳遞給構造函數)。根據我的經驗,我*很少*想通過調用默認構造函數'n'來填充數組,如果語言對我做出這樣的假設,我會討厭它。 –

+1

創建自己的方法來創建和初始化使用默認構造函數的對象的數組也是非常簡單的,如果這是一個您經常執行的操作足以證明它的合理性。 – Servy

8
CD[] cdLibrary = new CD[20]; 

這只不過是創建'容器',您將在其中存儲引用。考慮一下餅乾罐,適合20個餅乾。此時,您尚未創建一個cookie,您剛剛創建了一個jar(數組),該jar可以存放指定數量的cookie(本例中爲CD對象)。

for (int i=0; i<20; i++) { 
cdLibrary[i] = new CD(); 
} 

這將創建20個餅乾並將其放入jar中。

編輯:Jon Skeet在評論部分提到了一個很好的觀點,一定要檢查一下。他的比喻沒有這個問題,應該被認爲更準確(雖然餅乾比紙更有趣)。

+2

我不是特別喜歡餅乾罐類比,因爲餅乾罐不是自然排列的* - 這就是爲什麼我給出了一定數量的頁面的書的比喻。 (它也適用於我經常在變量和一張紙之間使用的類比,但這是一個稍微不同的問題。)區分對象和引用也很重要 - jar不包含CD *對象*,它持有參考。 –

+0

@JonSkeet:我完全看了看順序。你的比喻確實比較合適,我在編輯中提到它。 –

+0

我被C++歪曲 - 也有新的init。它提供了什麼參考?我有訂單嗎?我不這麼認爲。或者,如果它是垃圾收集的問題,但爲什麼初始化單出? –