Подтвердить что ты не робот

Порядок операций с использованием Синтаксиса инициализатора объекта

Выполняется ли порядок, в котором я устанавливаю свойства с использованием синтаксиса инициализатора объекта, в том же порядке?

Например, если я это сделаю:

var s = new Person { FirstName = "Micah",
                     LastName = "Martin",
                     IsLoaded = true
                   }

каждое свойство будет установлено в том же порядке?

4b9b3361

Ответ 1

Да.

Извинения за то, что вас прервали (я должен делать некоторые работы так часто). Спецификация явно не говорит об этом, но это делает довольно понятным ИМО в разделе 7.6.10.2:


Инициализатор объекта состоит из последовательности инициализаторов элементов, заключенных {и} токенами и разделенных запятыми.

(Обратите внимание на слово "последовательность" здесь, а не на "set". Я лично считаю, что значительная последовательность упорядочивается.)

Следующий класс представляет точку с двумя координатами:

public class Point
{
    int x, y;
    public int X { get { return x; } set { x = value; } }
    public int Y { get { return y; } set { y = value; } }
}

Экземпляр Point может быть создан и инициализирован следующим образом:

Point a = new Point { X = 0, Y = 1 };

который имеет тот же эффект, что и

Point __a = new Point();
__a.X = 0;
__a.Y = 1; 
Point a = __a;

где __a - невидимая и недоступная временная переменная.


EDIT: У меня был ответ от Mads Torgersen, который в основном сказал, что все, что может быть сделано сейчас, сохранит заказ. В будущем могут быть некоторые странности, когда порядок не сохраняется в странных случаях, когда вы делаете что-то другое, кроме установки свойства/поля, но это будет зависеть от того, куда идет язык.

Стоит отметить, что здесь происходит множество шагов: порядок выполнения оценки аргументов (т.е. бит RHS) и порядок выполнения назначений. Например, если у вас есть:

new Foo
{
    A = X,
    B = Y
}

возможны все следующие заказы, сохраняя при этом порядок выполнения фактического свойства (A и B):

  • Оцените X, назначьте A, оцените Y, назначьте B
  • Оцените X, оцените Y, назначьте A, назначьте B
  • Оцените Y, оцените X, назначьте A, назначьте B

Я считаю, что первый вариант - это тот, который был фактически принят, но это было просто для того, чтобы продемонстрировать, что там больше, чем кажется на первый взгляд.

Я также очень опасаюсь писать код, который зависит от этого...