2009-01-30 9 views
23

L'ordre dans lequel j'ai défini les propriétés à l'aide de la syntaxe de l'initialiseur d'objet est-il exécuté dans le même ordre?Ordre des opérations utilisant Object Initializer Syntaxe

Par exemple, si je fais ceci:

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

seront chaque propriété Préparez-vous dans le même ordre?

Répondre

36

Oui. Je m'excuse d'être interrompu (je dois faire du travail de temps en temps). La spécification ne explicitement dire, mais il est assez clair OMI dans la section 7.6.10.2:


Un initialiseur d'objet est constitué d'une séquence des initialisations membres, entourés par {et} jetons et séparés par des virgules.

(Notez le mot « séquence » ici, plutôt que « set » Personnellement, je pense que est significatif, comme une séquence est ordonnée..)

La classe suivante représente un point avec deux coordonnées:

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

une instance de point peut être créé et initialisé comme suit:

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

qui a le même effet une s

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

où __a est une variable temporaire autrement invisible et inaccessible.


EDIT: J'ai eu une réponse de Mads Torgersen, qui a essentiellement dit que tout ce qui peut être fait maintenant préserver l'ordre. Il peut y avoir des bizarreries à l'avenir où l'ordre n'est pas préservé dans des cas étranges où vous faites quelque chose d'autre que la définition d'une propriété/champ, mais cela dépendra de l'endroit où la langue va. Il est intéressant de noter qu'il y a en fait beaucoup de choses à faire ici - il y a l'ordre d'exécution de l'évaluation des arguments (c'est-à-dire les bits RHS) et l'ordre d'exécution des affectations. Par exemple, si vous avez:

new Foo 
{ 
    A = X, 
    B = Y 
} 

toutes les commandes suivantes sont possibles tout en maintenant l'ordre de l'exécution de la propriété réelle (A et B):

  • Évaluer X, attribuez à A, évaluer Y, attribuer à B
  • évaluer X, Y évaluer, affecter à un, attribuer à B
  • évaluer Y, évaluer X, affecter à A, attribuer à B

Je crois que la première option est celle qui a été prise, mais c'était juste pour montrer qu'il y a plus que cela ne se voit.

Je serais aussi très Méfiez-vous écrire effectivement du code qui dépend de cette ...

+1

Mec! Tu es meilleur que Chuck Norris! – Micah

+3

vous êtes la référence. – Micah

+1

Ma plus grande préoccupation est que les affectations se produisent dans l'ordre où je les liste. Je ne suis pas préoccupé par l'ordre d'évaluation de droite autant que je suis sur l'ordre d'affectation côté gauche réelle. – Micah