2009-11-20 6 views
3

Dans ma classe d'interface utilisateur, un développeur a la possibilité de définir une propriété d'emplacement (type de System.Drawing.Point). Par défaut, cette propriété est initialisée à Point.Empty. Le code interne qui est encapsulé par la classe utilise la propriété .IsEmpty de la propriété Point pour déterminer si un emplacement a été défini. Si la propriété n'est pas vide, la valeur x/y sera utilisée. S'il est vide, le code tentera de le placer avec un algorythme ligne/colonne. J'utilise le .IsEmpty de la propriété pour déterminer si elle a été définie.
À ma grande surprise, si un développeur met la propriété à 0,0, il apparaît comme vide. Un point de 0,0 est valide dans les graphiques. Je comprends également pourquoi le .IsEmpty renvoie vrai pour la valeur 0,0..NET Point.IsEmpty vs IsDefined

1) Sans créer ma propre classe ou hériter de System.Drawing.Point, existe-t-il un moyen de savoir si la propriété a été définie?

La seule idée que je peux penser est de par défaut la propriété avec une valeur de "new Point (-1, -1)" et de tester contre cela. Y a-t-il un meilleur moyen? Si non, veuillez confirmer.

J'utilise C# dans Visual Studio 2005 et Visual Studio 2008

Merci!

Répondre

5

Il y a quelques façons:

  1. Faire la propriété d'un point annulable, de cette façon, il sera « nul » lorsque vous avez défini pas
  2. piste si quelque chose a appelé la méthode setter par la définition d'un champ booléen privé sur vrai

ie. soit:

public Point? Location { ... } 

ou:

public Point Location 
{ 
    get ... 
    set 
    { 
     _LocationSet = true; 
     _Location = value; 
    } 
} 
+0

Les types nullables ont déjà deux propriétés "HasValue" et "Value" pas besoin de définir les vôtres. –

+0

Oui je l'ai fait et mon point est que la définition de vos propres propriétés serait plus compliquée et n'ajouterait aucune valeur réelle à ce que le type nullable fournit. Stick avec le type Nullable. –

+0

Cela dépend, avec votre propre valeur interne comme ceci, il n'y aurait aucun moyen de "désactiver" la valeur. Cela dépend de ce que la personne veut. –

2

Conserver le champ Point? (sucre syntaxique pour Nullable<Point>) au lieu de Point. Cela permet essentiellement de savoir si la valeur est "réelle" une valeur nulle. La façon dont vous exposez la propriété dépend de vous - vous pouvez l'exposer comme Point et lui faire lancer une exception si vous essayez de la récupérer sans la définir, ou vous pouvez l'exposer comme Point? ce qui lui permettrait d'être "désactivé" en définissant à annuler à nouveau plus tard.

Les types de valeurs nulles sont conçus précisément pour ce type de situation.

+0

J'ai essayé la modification suggérée et j'ai obtenu les erreurs suivantes ... 'System.Nullable ' ne contient pas de définition pour 'X'. La même chose est rapportée pour 'Y', et 'IsEmpty' Des idées sur ce que je fais mal? – cbuck12000

+0

nevermind - Je l'ai compris. J'aime! – cbuck12000

+1

Vous devez utiliser "p.Value.X" car vous utilisez maintenant un type Nullable. –

1

je pourrais envisager d'utiliser un annulable Point: System.Drawing.Point? Nullable qui fournirait un chemin plus propre pour savoir si quelque chose est défini ou non.