C# Personnalisé getter/setter sans variable privée
J'ai appris le c# récemment, alors quand j'ai appris à écrire des propriétés, on m'a appris à le faire comme ceci:
public string Name { get; set; }
Auto propriétés sont très! Mais maintenant, je suis en train de faire quelque chose d'un peu plus compliqué, donc j'ai besoin d'écrire une paire personnalisée d'accesseurs.
private string _Name;
public string Name {
get { return _Name; }
set { _Name = value }
}
Je sais que le compilateur fait une instance privée variable vers le bas dans les profondeurs lorsque l'on utilise les autos, mais je suis gâté et ne voulez pas la variable privée assis autour de la recherche inutile.
Est-il un moyen d'utiliser les accesseurs personnalisés sans une variable privée?
- Pas de. il n'est pas possible.
- Oui! Créer une automobile privé de la propriété! JK. Qu'est-ce exactement que vous essayez de faire - qu'est-ce que votre "custom accesseurs" serait de faire qui ne nécessite pas une propriété privée?
- Qu'entendez-vous par "custom accesseurs" exactement? Ce qui est "personnalisé" à propos d'eux?
- Je pense que par "custom", il signifie que tous les non-automatique de propriétés.
- Pourquoi n'est-il pas possible! que diriez -
public string Age { get {return 16;} set{doNothingWithThis(value);}}
. Il est possible - je ne sais pas s'il serait utile si? - Comment la variable privée "regardez inutile" si il est utilisé?
- Il peut signifier différentes de l'accessibilité pour les getters vs setters.
- Accesseur est utilisé pour accéder à une variable, de sorte que la réponse serait non
- Juste au cas où quelqu'un en fait je me demandais, par la coutume, je veux dire, (je ne suis pas sûr de ce que je voulais dire quand j'ai écrit cette HEURE auparavant, parce que la réponse est si clair maintenant, je m'égare) je veux dire que je devais faire exactement ce que Josh Happoldt la réponse suggérée, exécuter un couple d'appels de méthode pour voir ce que la propriété doit ressembler à
- Simple grande Réponse. +1 pour faire un commentaire plus fort que de réponses listées ci-dessous.
- Une meilleure approche de ce problème est suivi ici: github.com/dotnet/csharplang/issues/133
Vous devez vous connecter pour publier un commentaire.
Propriétés n'ont pas besoin de la sauvegarde des variables (champs) à tous. Alors qu'ils peuvent être utilisés pour l'encapsulation des champs simples vous pouvez également les utiliser pour accéder à d'autres données.
ou
Si le but est simplement d'encapsuler le terrain, avec une propriété que vous aurait besoin d'une sorte de champ de stockage si vous n'êtes pas à l'aide automatique propriétés.
get
etset
est juste un raccourci pour la création de deux méthodes différentes appeléget_PropertyName
etset_PropertyName
La réponse est Non, vous ne pouvez pas le faire.
C'est à cause de la récursivité. (Voir les numéros de ligne 9 et 7):
name
, vous bénéficiez également de_name
.Non, je crains que non. Le compilateur est assez intelligent pour que cela se produise pour vous auto-généré propriétés, mais avec des propriétés standard j'imagine que la logique derrière quelque chose comme ça serait la fin jusqu'à obtenir de la manière et de faire plus de mal que de bien.
Par exemple, si je créer une propriété comme cela...
Serait le compilateur (avec la fonction que vous cherchez) créer une sauvegarde de variable privée? Pourquoi? Il n'en a pas besoin.
En outre, si la valeur n'est pas créé jusqu'à ce que le temps de compilation, qu'allez-vous faire référencer dans votre code:
Qu'est-ce que
_Name
? Que faire si vous avez une autre valeur ailleurs appelé_Name
? Alors ce serait le compilateur appel à la sauvegarde de la valeur de cette propriété? Que faire si j'ai besoin de deux la sauvegarde des valeurs? Serait le compilateur être assez intelligent pour qui?Il a été demandé avant, mais j'imagine que la réponse va continuer à être un "non" pour l'avenir prévisible.
Une auto-propriété est abréviations syntaxiques de directe et simple de l'accès des membres. (Et j'imagine que l'une de ses forces motrices était simplement d'essayer d'amener les gens à arrêter de créer des
public
directement les valeurs.) Les propriétés peuvent croître en complexité au-delà de ce très facilement et personnellement, je ne voudrais pas le compilateur à essayer de comprendre ce que je peux facilement il vous suffit de lui faire.