Итак, это мясо вопроса: может ли Foo.Bar когда-либо возвращать null? Чтобы уточнить, может ли "_bar" быть установлено значение null после того, как оно будет оценено как непустое и до того, как оно будет возвращено?
public class Foo
{
Object _bar;
public Object Bar
{
get { return _bar ?? new Object(); }
set { _bar = value; }
}
}
Я знаю, что использование следующего метода get небезопасно и может возвращать нулевое значение:
get { return _bar != null ? _bar : new Object(); }
UPDATE:
Еще один способ взглянуть на ту же проблему, этот пример может быть более ясным:
public static T GetValue<T>(ref T value) where T : class, new()
{
return value ?? new T();
}
И снова спрашивая, может ли GetValue (...) когда-либо возвращать null? В зависимости от вашего определения это может быть или не быть потокобезопасным... Я предполагаю, что правильная постановка задачи задается вопросом, является ли это атомной операцией по значению... Дэвид Яу определил вопрос лучше всего, сказав, что указанная выше функция эквивалентна к следующему:
public static T GetValue<T>(ref T value) where T : class, new()
{
T result = value;
if (result != null)
return result;
else
return new T();
}