Ordine delle operazioni usando la syntax Initializer dell’object

L’ordine in cui imposto le proprietà utilizzando la syntax di inizializzazione dell’object viene eseguito esattamente nello stesso ordine?

Ad esempio se faccio questo:

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

ogni proprietà verrà impostata nello stesso ordine?

Sì.

Mi scuso per essermi interrotto (devo effettivamente lavorare un po ‘ogni tanto). La specifica non lo dice esplicitamente , ma rende abbastanza chiaro l’IMO nella sezione 7.6.10.2:


Un inizializzatore di oggetti consiste in una sequenza di inizializzatori di membri, racchiusi tra {e} token e separati da virgole.

(Nota la parola “sequenza” qui, piuttosto che “set”. Personalmente ritengo che sia significativo, in quanto viene ordinata una sequenza.)

La seguente class rappresenta un punto con due coordinate:

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

Un’istanza di Point può essere creata e inizializzata come segue:

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

che ha lo stesso effetto di

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

dove __a è una variabile temporanea altrimenti invisibile e inaccessibile.


EDIT: Ho ricevuto una risposta da Mads Torgersen, che ha sostanzialmente affermato che tutto ciò che può essere fatto ora conserverà l’ordine. Potrebbero esserci delle stranezze in futuro in cui l’ordine non viene conservato in casi strani dove si sta facendo qualcosa di diverso dall’impostazione di una proprietà / campo, ma ciò dipenderà da dove la lingua va.

Vale la pena sottolineare che ci sono in realtà molti passi avanti qui – c’è l’ordine di esecuzione della valutazione degli argomenti (cioè i bit RHS) e l’ordine di esecuzione dei compiti. Ad esempio, se hai:

 new Foo { A = X, B = Y } 

tutti i seguenti ordini sono possibili pur mantenendo l’ordine di esecuzione effettiva della proprietà (A e B):

  • Valuta X, assegna a A, valuta Y, assegna a B
  • Valuta X, valuta Y, assegna a A, assegna a B
  • Valuta Y, valuta X, assegna a A, assegna a B

Credo che la prima opzione sia quella effettivamente presa, ma questo era solo per dimostrare che c’è di più rispetto a ciò che si vede.

Sarei anche molto prudente nel scrivere codice che dipende da questo …