繁体   English   中英

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

[英]What's wrong with the ?? operator used like this:

所以写作:

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 ......”

你们有什么感想 ?

问候,

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

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

你的意思是:

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

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

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

如果obj.Collection不为null,则代码将发出不必要的赋值(obj.Collection自身),但除此之外,它等同于原始代码。

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

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

我要说它还取决于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() obj.Collection = obj.Collection ?? new Collection()真的很贵。

但是,如果您需要“按需”创建集合,则通常在属性getter中使用类似的模式,如下所示:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM