Является ли нулевой оператор объединения потокобезопасным?

Итак, это суть вопроса: может ли 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(); }

ОБНОВЛЕНИЕ :

Другой способ взглянуть на ту же проблему, этот пример мог бы быть более ясным:

        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();
        }
24
задан csharptest.net 6 January 2011 в 21:19
поделиться