[英]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.