7

所以,而不是写作:

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

4 回答 4

15

如果我必须在这两个代码块之间进行选择,我会使用前者。它更具可读性,并且是一种常见的模式。??在需要默认值(例如DateTime date = nullableDateTimeInstance ?? defaultDate;)的情况下很有用。

但坦率地说,我会尽量避免出现我想添加到集合中的情况,并且集合可能为空。相反,我会确保在构造函数中初始化集合或任何情况。

于 2011-01-23T19:24:39.027 回答
3

你的意思是:

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

如果是这样,您可以将其重写为

(obj.Collection = (obj.Collection ?? new Collection())).Add(something);
于 2011-01-23T19:25:13.410 回答
0

如果 obj.Collection 不为空,则代码将发出一个不必要的赋值(将 obj.Collection 分配给自身),但除此之外它与原始赋值相同。

如果您不在时间关键部分使用它,对我来说看起来不错。无论如何,编译器有可能优化分配,但我不知道它是否会。

也许只是感觉不对,因为原始代码是如此常见且简单的模式,以至于更改它感觉不对。

于 2011-01-23T19:22:15.007 回答
0

我想说这还取决于Collection属性的设置器的作用。考虑一下:

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() ); } 
}
于 2011-01-23T20:02:11.143 回答