31 votes

La syntaxe d'initialiseur

J'aime le C# 3 initialiseur de la syntaxe et de l'utiliser beaucoup, mais aujourd'hui, alors que la recherche dans le Réflecteur, la suite est venu:

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

Au début je pensais que c'était une erreur, mais il ne compile! Suppose que je suis encore à apprendre de nouvelles choses tout le temps. :)

À partir de ce que je peux dire, il définit l' MaxArrayLength de la propriété de l' ReaderQuotas de la propriété de l' WSHttpBinding.

Cette syntaxe créer un nouveau ReaderQuotas objet, puis définir la propriété, ou faut-il assumer la propriété d'être initialisé déjà? Est-ce la voie générale, on pourrait utiliser pour initialiser "enfant", propriétés?

Je trouve que la syntaxe un peu déroutant...

23voto

Marc Gravell Points 482669

Non, ce n'est pas de créer de nouveaux objets, sauf si vous utilisez = new SomeType {...}:

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

Votre exemple montre l'initialiseur de syntaxe pour la définition des propriétés de l' existant, des sous-objets. Il y a aussi un la même syntaxe pour appeler "Ajouter" méthodes sur les collections.

Votre code est largement comparable:

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

15voto

Eric Lippert Points 300275

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

Vous devriez lire la section 7.6.10.2 de le cahier des charges; il est tout expliqué il n'. Par exemple:

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

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X