2011-01-23 36 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()); } 
}