这有什么问题?运算符使用如下:

时间:2011-01-23 19:19:51

标签: c# coalesce

如此写作:

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 个答案:

答案 0 :(得分:15)

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

但坦率地说,我试图不会在我想要添加到集合的情况下结束,并且集合可能是null。相反,我会确保在构造函数中初始化集合,或者无论情况如何。

答案 1 :(得分:3)

你的意思是:

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

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

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

答案 2 :(得分:0)

如果obj.Collection不为null,代码将发出不必要的赋值(对象本身为obj.Collection),但除此之外它与原始代码相同。

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

也许只是感觉不对,因为原始代码是一种常见且简单的模式,改变它是错误的。

答案 3 :(得分: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() ); } 
}