比方說,我有一個屬性:「返回新集合<T>(myList)」會在每次調用它時創建新的集合對象嗎?
public Collection<T> GameCollection
{
get { return new Collection<T>(_myGameList); }
}
請問這種方法創造了新的集合對象每次它叫什麼名字?
比方說,我有一個屬性:「返回新集合<T>(myList)」會在每次調用它時創建新的集合對象嗎?
public Collection<T> GameCollection
{
get { return new Collection<T>(_myGameList); }
}
請問這種方法創造了新的集合對象每次它叫什麼名字?
是的,它會,因爲new
。但它不重複myGameList
或其內容;它只爲相同的myGameList
生成新的包裝(請參閱Collection(IList<T>)
constructor)。
如果你想防止這一點,並返回一個集合,你可以初始化支持字段,而不是和你的吸氣拿到場(假設_myGameList
已初始化過):
private Collection<T> _myGameCollection = new Collection<T>(_myGameList);
public Collection<T> GameCollection
{
get { return _myGameCollection; }
}
我這樣做,但我無法想象,我想要公開每個列表,我必須創建一個包裝。 –
爲什麼不呢?現在,對於您想要公開的每個列表,您都會創建* many * wrappers - 每次有人讀取該屬性時都會創建一個新的列表。 –
你是對的。我認爲它會以某種方式**神奇**由C#編譯器解決,哈哈;) –
是,它會。當您使用new
關鍵字時,您始終會創建一個新實例。
是的,它會創建一個新的集合,但這並不像聽起來那麼糟糕。
對於大多數類型,新集合僅包含引用到每個項目。換句話說,它僅僅是集合中每個對象的額外4個字節的RAM,而不是複製所有對象的成本。當然,例外是價值類型,但您仍然需要小心使用這些類型。
它會創建一個Collection<T>
的新實例,但每個新實例都會包裝相同的基礎集合。 (每個文檔,構造函數重載需要IList<T>
wraps現有的集合。)
所以你會返回一個新的Collection<T>
實例每次有人讀取性能(這是一種浪費,而且會造成大量的垃圾收集)但它會返回一些邏輯上每次都會像相同的集合一樣的東西。
當然。這是正確的機率非常接近於零。 –