objects - c# list object



Syntaxe de l'initialiseur d'objet imbriqué (1)

Resharper vient de me proposer le refactoring suivant:

// Constructor initializes InitializedProperty but
// the UninitializedSubproperty is uninitialized.
var myInstance = new MyClass();
myInstance.InitializedProperty.UninitializedSubproperty = new MyOtherClass();

// becomes

var myInstance = new MyClass
    {
        InitializedProperty = { UninitializedSubproperty = new MyOtherClass() }
    };

Je n'ai jamais vu ce type d'initialisation d'objet auparavant. En particulier je ne vois pas comment

InitializedProperty = { UninitializedSubproperty = new MyOtherClass() }

n'a aucun sens - il n'attribue rien à InitializedProperty .

Ce comportement est-il spécifié quelque part?


Cette syntaxe est appelée initialisation d'objet . La spécification C # donne clairement beaucoup d'exemples à ce sujet:

7.6.10.2 Initialiseurs d'objet

Un initialiseur d'objet consiste en une séquence d'initialiseurs de membres, entourés de {et} jetons et séparés par des virgules. Chaque initialiseur de membre doit nommer un champ ou une propriété accessible de l'objet en cours d'initialisation, suivi d'un signe égal et d'une expression ou d'un initialiseur d'objet ou de collection. Il est erroné qu'un initialiseur d'objet inclue plusieurs initialiseurs de membres pour le même champ ou la même propriété. L'initialiseur d'objet ne peut pas faire référence au nouvel objet qu'il initialise.

Les exemples sont:

Rectangle r = new Rectangle
            {
                P1 = { X = 0, Y = 1 },
                P2 = { X = 2, Y = 3 }
            };

Compile jusqu'à:

Rectangle r = new Rectangle();
r.P1.X = 0;
r.P1.Y = 1;
r.P2.X = 2;
r.P2.Y = 3;

Ayant:

public class Rectangle
{
    public Rectangle()
    {
        P1 = new Point(); //default Point for demo purpose
        P2 = new Point(); //default Point for demo purpose
    }

    public Point P1 { get; set; }
    public Point P2 { get; set; }
}

et

public class Point
{
    public int X { get; set; }
    public int Y { get; set; }
}

Envisagez également de lire un excellent chapitre 8.3 Initialisation simplifiée dans le livre C # in depth . Jon Skeet fournit un autre aperçu des avantages de l'utilisation de ce type de syntaxe pour l'initialisation de structures arborescentes.





object-initializers