.net - réelle - priorité des opérateurs en c



Ordre des opérations à l'aide de la syntaxe d'initialisation d'objet (1)

Oui.

Je m'excuse d'être interrompu (je dois faire du travail de temps en temps). La spécification ne le dit pas explicitement , mais cela rend assez clair IMO dans la section 7.6.10.2:

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

(Notez le mot "séquence" ici, plutôt que "définir".) Personnellement, je pense que c'est important, car 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éée et initialisée comme suit:

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

qui a le même effet que

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 reçu une réponse de Mads Torgersen, qui a essentiellement dit que tout ce qui peut être fait maintenant va préserver l'ordre. Il peut y avoir des bizarreries à l'avenir où l'ordre n'est pas conservé dans des cas étranges où vous faites autre chose que de définir une propriété / un champ, mais cela dépendra de l'endroit où la langue va.

Il convient de souligner 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 assignations. Par exemple, si vous avez:

new Foo
{
    A = X,
    B = Y
}

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

  • Évaluer X, affecter à A, évaluer Y, affecter à B
  • Évaluer X, évaluer Y, affecter à A, affecter à B
  • Évaluer Y, évaluer X, affecter à A, affecter à 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éfiant d'écrire du code qui dépend de ça ...

Est-ce que l'ordre dans lequel je définis les propriétés en utilisant la syntaxe de l'initialiseur d'objet est exécuté dans le même ordre?

Par exemple si je fais ceci:

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

Est-ce que chaque propriété sera définie dans le même ordre?





object-initializers