Что не так с ??оператор использовал вот так: - PullRequest
7 голосов
/ 23 января 2011

Настолько уверенно писать:

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 ]

15 голосов
/ 23 января 2011

Если бы мне пришлось выбирать между этими двумя блоками кода, я бы использовал первый. Это более читабельно, и это обычная модель. ?? полезно в сценариях, где вам нужно значение по умолчанию (например, DateTime date = nullableDateTimeInstance ?? defaultDate;).

Но, честно говоря, я бы постарался не оказаться в ситуации, когда я хочу добавить в коллекцию, и возможно, что коллекция пуста. Вместо этого я бы удостоверился, что коллекция инициализируется в конструкторе или в любом другом случае.

3 голосов
/ 23 января 2011

Вы имеете в виду:

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

Если так, вы можете переписать его как

(obj.Collection = (obj.Collection ?? new Collection())).Add(something);
0 голосов
/ 23 января 2011

Я бы сказал, что это также зависит от того, что делает установщик свойства 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() ); } 
}
0 голосов
/ 23 января 2011

Код выдаст ненужное присваивание (объекта obj.Collection), если значение obj.Collection не равно нулю, но кроме этого оно эквивалентно оригиналу.

Выглядит хорошо для меня, если вы не используете его во временных разделах. В любом случае, возможно, компилятор может оптимизировать назначение, но я не знаю, будет ли это или нет.

Возможно, это просто кажется неправильным, потому что исходный код является настолько распространенным и простым шаблоном, что кажется неправильным изменять его.

...