7
votes

Les propriétés automatiques en C # 3 - doivent déclarer un corps pour obtenir si je déclare un pour l'ensemble?

J'utilise vs 2008, et dans mes pages de propriété pour le projet, je vois que je cible .net 3.5.

Voici l'erreur que je reçois lorsque vous essayez de compiler: < BlockQuote>

amsdatamodels.vehicle.vin.get 'doit déclarer un corps car il n'est pas marqué abstrait, extérieur ou partiel

et voici le code: xxx

si je dépouille le corps de set de sorte que c'est juste: xxx

Tous les œuvres, mais je perds ma capacité à vérifier le VIN tel qu'il est défini.

Est-ce que quelqu'un a une suggestion de résoudre ce problème ou un meilleur moyen d'aborder le problème à la main?

J'aime vraiment la notation sténographie - mais la vérification de la légitimité de l'entrée est également importante!


3 commentaires

Grâce à tous ceux qui l'ont noté, je n'étais pas réellement fixé la valeur nulle part - honnêtement, je n'avais pas encore compris ce que la variable locale que le compilateur créait a été appelée. Y a-t-il un mot clé spécial?


Pas de mot clé spécial - il n'y a aucun moyen d'accéder aux trucs automatiques générés par le compilateur. Ce qui fait depuis que la puissance du code généré est de la simplicité et la capacité du compilateur à savoir exactement comment elle est accessible. Si vous pouviez définir ou accéder au champ Auto, le compilateur ne pouvait pas faire presque autant d'hypothèses sur son utilisation.


Vous rencontrerez le même problème lorsque vous essayez d'utiliser InotifyPropertyChanged, la beauté des propriétés automatiques est rapidement perdue :(


4 Réponses :


3
votes

Oui, vous devrez déclarer également la mise en œuvre. Oh, et votre code de jeu ne fait rien d'autre que la validation. Vous devrez également fournir une implémentation supplémentaire pour cela, en supposant que vous souhaitez définir la valeur si elle passe la validation.

Si vous avez besoin de quelque chose de plus que de simples implémentation d'obtention / définition de base, vous devrez mettre en œuvre toute la propriété, pas seulement la différence.


0 commentaires

18
votes

Si vous allez ajouter une logique dans l'ensemble, vous devez l'ajouter dans le get également. AVIS DANS VOTRE ENGAGE Vous ne définissez pas vraiment de valeur à rien?

Ajouter un champ de support, P>

public string VIN
{
    get { return _vin; }
    set
    {
      if (value.Length != 17) 
        throw new ArgumentOutOfRangeException("VIN", "VIN must be 17 characters"); 
      else
        _vin = value;
    }
}


4 commentaires

Merci, je suppose que ma première priorité m'assurait que je ne faisais pas de travail inutile, créant ainsi le domaine privé ou n'étant pas essayé d'utiliser les propriétés automatiques.


En fait, vous n'avez pas besoin de créer un champ vient de retourner vin :)


"Retour vin"? Ce serait une fonction récursive à moins que je manque quelque chose d'évident ...


Si vous vous manquez que je suis aussi.



6
votes

Lorsque des propriétés automatiques sont utilisées, le compilateur génère automatiquement un champ de support. Lorsque vous déclarez le vôtre, il n'y a aucun moyen de savoir quel champ utiliser pour la méthode Obtention. Donc, vous devez déclarer les deux ou aucun.

Incidemment, votre méthode de jeu actuelle ne vérifie que la valeur - elle ne l'attribue jamais vraiment à rien.


0 commentaires

2
votes

Vous devrez utiliser le bon champ de support OL '. La notation à main ne peut pas être mélangée. Le seul plaisir supplémentaire est de changer le modificateur d'accès sur Get and Set, par exemple. avoir; ensemble privé;


0 commentaires