2009-01-30 24 views
23

Czy kolejność ustawiania właściwości za pomocą składni inicjalizatora obiektu jest wykonywana w dokładnie tej samej kolejności?Kolejność operacji przy użyciu składni inicjatora obiektu

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

będzie każda nieruchomość gotowi w tej samej kolejności:

Na przykład, jeśli mogę to zrobić?

Odpowiedz

36

Tak.

Przepraszam za przerwanie (muszę tak często wykonywać pracę). Spec nie wyraźnie powiedzieć, lecz to sprawia, że ​​całkiem jasne IMO części 7.6.10.2:


Przedmiotem Inicjator składa się z sekwencji inicjalizatorów członkowskich, zamkniętych {i} żetonów i oddzielonych przecinkami.

(Uwaga słowo „sekwencji” tutaj, zamiast „set” Osobiście uważam, że to istotne, jako sekwencja jest uporządkowane.).

Poniższa klasa reprezentuje punkt z dwóch współrzędnych:

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

instancja punkt może być utworzony i inicjowany w następujący sposób:

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

, który ma ten sam efekt a s

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

gdzie __a jest niewidoczną i niedostępną w inny sposób zmienną tymczasową.


EDIT: miałem odpowiedź od Mads Torgersen, który powiedział, że w zasadzie wszystko, co można zrobić teraz będzie zachować kolejność. W przyszłości mogą istnieć pewne dziwactwa, w których zamówienie nie jest zachowywane w dziwnych przypadkach, gdy robisz coś innego niż ustawienie właściwości/pola, ale to zależy od tego, gdzie ten język się znajduje.

Warto zauważyć, że w rzeczywistości dzieje się tu dużo kroków - jest kolejność wykonywania oceny argumentów (tj. Bitów RHS) i kolejność wykonywania zadań. Na przykład, jeśli masz:

new Foo 
{ 
    A = X, 
    B = Y 
} 

wszystkie następujące rozkazy są możliwe, jednocześnie zachowując kolejność wykonywania faktycznej własności (A i B):

  • ocenić X, przypisywanie do A, ocenić Y, przypisywanie do B
  • oceniać X, ocenić Y, przypisać do przypisać do B
  • ocenić Y, ocenić X, przypisanie do A, przypisać do B

Uważam, że pierwszą opcją jest ta, która faktycznie została podjęta, ale miało to na celu wykazanie, że jest w niej coś więcej, niż na pierwszy rzut oka.

Byłbym również bardzo ostrożny rzeczywiście pisanie kodu, który polega na tym ...

+1

Dude! Jesteś lepszy niż Chuck Norris! – Micah

+3

ty jesteś referencją. – Micah

+1

Moim największym zmartwieniem jest to, że zadania pojawiają się w kolejności, w jakiej je wymieniam. Nie martwię się o porządek oceny po stronie prawej tak samo jak o rzeczywistą kolejność przypisania lewej strony. – Micah

Powiązane problemy