2011-01-23 35 views
7

所以insteed寫的:這是怎麼回事?使用這樣的操作:

if (obj.Collection == null) 
    obj.Collection = new Collection(); 
obj.Collection.Add(something); 

我今天寫的:

obj.Collection = obj.Collection ?? new Collection; 
obj.Collection.Add(something); 

這樣的感覺錯了,尤其是這部分「obj.Collection = obj.Collection .. 。「

你們認爲什麼?

問候,

+4

爲什麼感覺錯了嗎? – alexn 2011-01-23 19:21:36

+0

對我來說似乎很好 – Vadim 2011-01-23 19:23:18

+4

有什麼問題?你有`x = x + 1;`的問題嗎? – 2011-01-23 19:23:40

回答

15

如果我不得不在這兩個代碼塊之間進行選擇,我會使用前者。它更具可讀性,並且是一種常見模式。 ??在需要默認值的情況下很有用(例如,DateTime date = nullableDateTimeInstance ?? defaultDate;)。

但坦率地說,我會盡量不要在我想要添加到集合的情況下結束,並且可能收集爲空。相反,我會確保集合在構造函數中初始化或任何情況下都可以。

0

該代碼將發出的不必要的分配(obj.Collection的自身)如果obj.Collection不爲空,但比它是等同於原始其它。

看起來不錯,只要你不在時間關鍵部分使用它。無論如何,編譯器可以優化分配,但我不知道它是否可行。

也許它只是感覺錯誤,因爲原始代碼是這樣一個常見和簡單的模式,它感覺錯誤的改變它。

3

你的意思是:

if (obj.Collection == null) 
    { 
     obj.Collection = new Collection(); 
    } 
obj.Collection.Add(something); 

如果是這樣,你可以把它改寫爲

(obj.Collection = (obj.Collection ?? new Collection())).Add(something); 
0

我說這也要看什麼Collection setter方法一樣。試想一下:

public Collection Collection 
{ 
    get { return _collection; } 
    set 
    { 
     _collection = value; 
     Thread.Sleep(1000); // or some expensive real work 
    } 
} 

在這種情況下,分配obj.Collection = obj.Collection ?? new Collection()將是非常昂貴的。

但是,如果你需要「按需」創建一個集合,它是共同的屬性的getter使用類似的模式,就像這樣:

public Collection Collection 
{ 
    get { return _collection ?? (_collection = new Collection()); } 
}