Порядок операций с использованием синтаксиса инициализатора объекта
-
20-08-2019 - |
Вопрос
Выполняется ли порядок, в котором я задаю свойства, используя синтаксис инициализатора объекта, в точно таком же порядке?
Например, если я сделаю это:
var s = new Person { FirstName = "Micah",
LastName = "Martin",
IsLoaded = true
}
будет ли каждое свойство установлено в одном и том же порядке?
Решение
ДА.
Приношу извинения за то, что меня прервали (на самом деле мне время от времени приходится выполнять кое-какую работу).Спецификация не явно скажите это, но это делает это довольно ясным IMO в разделе 7.6.10.2:
Инициализатор объекта состоит из последовательности инициализаторов элементов, заключенных в токены { и } и разделенных запятыми.
(Обратите внимание на слово "последовательность" здесь, а не на "набор".Лично я считаю, что это важно, поскольку последовательность упорядочена.)
Следующий класс представляет точку с двумя координатами:
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 - в противном случае невидимая и недоступная временная переменная.
Редактировать:Я получил ответ от Мадса Торгерсена, который в основном сказал, что все, что можно сделать сейчас, сохранит порядок.В будущем могут возникнуть некоторые странности, когда порядок не сохраняется в странных случаях, когда вы что-то делаете Другое чем установка свойства / поля, но это будет зависеть от того, куда идет язык.
Стоит отметить, что на самом деле здесь выполняется множество шагов - есть порядок выполнения оценки аргументов (т.е.биты RHS) и порядок выполнения назначений.Например, если у вас есть:
new Foo
{
A = X,
B = Y
}
все следующие заказы возможны при сохранении порядка фактического исполнения свойства (A и B):
- Вычислить X, присвоить A, оценить Y, присвоить B
- Оценить X, оценить Y, присвоить A, присвоить B
- Оценить Y, оценить X, присвоить A, присвоить B
Я полагаю, что на самом деле был выбран первый вариант, но это было сделано просто для того, чтобы продемонстрировать, что в этом есть нечто большее, чем кажется на первый взгляд.
Я бы тоже был очень опасайтесь на самом деле писать код, который зависит от этого...