Question Syntaxe de l'initialiseur


J'aime la syntaxe de l'initialiseur C # 3 et l'utilise beaucoup, mais aujourd'hui, tout en regardant dans Reflector, les choses suivantes sont apparues:

var binding = new WSHttpBinding
{
  ReaderQuotas = { MaxArrayLength = 100000 },
  MaxReceivedMessageSize = 10485760
};

Au début, je pensais que c'était une erreur, mais ça compile! Je suppose que j'apprends encore de nouvelles choses tout le temps. :)

De ce que je peux dire, il définit la MaxArrayLength propriété du ReaderQuotas propriété du WSHttpBinding.

Cette syntaxe crée-t-elle une nouvelle ReaderQuotas objet et ensuite définir la propriété, ou suppose-t-il la propriété à initialiser déjà? Est-ce la manière générale dont on se sert pour initialiser les propriétés 'enfant'?

Je trouve la syntaxe un peu confuse ...


29
2018-01-07 12:17


origine


Réponses:


Non, cela ne crée pas de nouveaux objets sauf si vous utilisez = new SomeType {...}:

var binding = new WSHttpBinding
{
    ReaderQuotas = new XmlDictionaryReaderQuotas { MaxArrayLength = 100000 },
    MaxReceivedMessageSize = 10485760
};

Votre exemple montre la syntaxe de l'initialiseur pour définir les propriétés de existant sous-objets. Il existe également une syntaxe similaire pour appeler les méthodes "Ajouter" sur les collections.

Votre code est largement comparable à:

var binding = new WSHttpBinding();
binding.ReaderQuotas.MaxArrayLength = 100000;
binding.MaxReceivedMessageSize = 10485760;

22
2018-01-07 12:18



C'est un peu déroutant, je suis d'accord.

Vous devriez lire la section 7.6.10.2 de la spécification; tout est expliqué Là. Par exemple:

Un initialiseur de membre qui spécifie   une expression après le signe égal   est traité de la même manière qu'un   cession au domaine ou à la propriété.

Un initialiseur de membre qui spécifie un   initialiseur d'objet après les égaux   signe est un initialiseur d'objet imbriqué,   c'est-à-dire une initialisation d'un   objet. Au lieu d'attribuer un nouveau   valeur pour le domaine ou la propriété, le   affectations dans l'objet imbriqué   l'initialiseur sont traités comme des affectations   aux membres du domaine ou de la propriété.   Les initialiseurs d’objets imbriqués ne peuvent pas être   appliqué aux propriétés avec une valeur   tapez, ou à des champs en lecture seule avec un   type de valeur.

Un initialiseur de membre qui spécifie un   initialiseur de collection après le   est égal au signe est une initialisation d'un   collection intégrée. Au lieu de   assigner une nouvelle collection au   domaine ou propriété, les éléments donnés   dans l'initialiseur sont ajoutés à la   collection référencée par le champ ou   propriété.


14
2018-01-07 18:18