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

StackOverflow https://stackoverflow.com/questions/495616

Вопрос

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top