如此写作:
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 ......”
你们有什么想法?
此致
答案 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() ); }
}