2008-12-03 11 views
4

En C#, si je déclare une propriété implémentée automatiquement, pourquoi dois-je déclarer à la fois la partie get et la partie set?Pourquoi les propriétés automatiques requièrent-elles à la fois des getters et des setters?

à savoir

public string ThisWorks { get; set; } 

public string ThisDoesnt { get; } 

ne serait-ce que du sucre syntaxique - à savoir le compilateur insère un champ privé pour la propriété? Alors pourquoi le problème?

Curieux.

+0

Les deux fonctionnent correctement. le temps. –

+0

Mais n'oubliez pas d'ajouter un type à la propriété. Votre exemple ne fonctionnera pas comme c'est le cas maintenant. –

+0

Oups, bravo! Mais je vais devoir vous prendre à la tâche sur vos revendications - je reçois une erreur de compilation, tout droit. – Duncan

Répondre

28

Si vous n'aviez pas de setter, alors comment définiriez-vous la propriété?

Soit dit en passant, vous pouvez spécifier l'accessibilité, par exemple:

public string Foo 
{ 
    get; 
    private set; 
} 
11

Une propriété implémentée automatiquement n'a pas de magasin privé accessible, de sorte que vous auriez aucun moyen de définir la valeur sans setter, ce qui rend totalement inutile .

12

Sans setter, vous ne pourrez jamais fournir de valeur, car vous n'avez aucun moyen de spécifier le nom de la variable de backing.

J'ai demandé une propriété automatique en lecture seule, déclarée comme ceci:

public string ReadonlyProperty { get; readonly set; } 

qui créerait une variable de support en lecture seule, une propriété avec seulement un getter, et traduire tous les appels vers le poseur en accès direct la variable. Vous pouvez seulement appeler le setter dans le constructeur - comme pour les variables readonly normales.

Nous verrons si cette demande fait tout bon ... il est vraiment dommage qu'il est pas là pour le moment, car elle rend plus difficile à mettre en œuvre des types immuables que les types mutables :(

+0

Qu'est-ce que cela fournirait: "public readonly string ReadonlyProperty" ne serait pas autre que la possibilité de casser le point d'accès à la propriété? –

+0

@ffpf - chaîne publique en lecture seule Blah; <- ce n'est pas une propriété, c'est un champ. Vous avez besoin d'un get/set pour être une "propriété". Les champs ne sont pas ramassés sur des choses comme la liaison de données, les grilles de propriétés, etc. Ils ont une signification sémantique différente. –

+0

Voir http://csharpindepth.com/Articles/Chapter8/PropertiesMatter.aspx pour pourquoi je n'aime pas exposer les champs publics autres que les constantes * parfois *. –

3

Vous avez besoin d'une set - sinon, comment votre propriété auto-implémentée obtient-elle sa valeur? Lors de l'implémentation automatique de la propriété, vous devez avoir au moins un accesseur set pour lui donner une valeur pendant la construction

0

Fait intéressant, le nouveau compilateur Roslyn Visual Studio 2015 le permet maintenant, même si le projet est configuré pour utiliser C# version 5.