Créer des classe string
Je veux créer ma propre Adresse e-mail de classe qui agit comme une classe string.
Donc, je tiens à faire ce
private EMailAddress _emailAddress = "[email protected]";
au lieu de
private EMailAddress _emailAddress = new EMailAddress("[email protected]");
Est-il un moyen pour accomplir ce que je veux, ou je dois utiliser la seconde solution. Depuis que la chaîne est scellé, je ne peux pas l'utiliser, et l'opérateur = ne peut pas être surchargé, donc je suis à court d'idées de comment résoudre ce problème....
- Si ça ressemble à une chaîne, il devrait être une chaîne de caractères. Je ne suis pas sûr que c'est possible et même est une bonne idée.
- Est la classe string défectueux?
- Pas on pourrait s'attendre à voir ce genre de chose. Il suffit de créer votre propre classe.
- Ouais, c'est vraiment une idée terrible.
- Juste au sujet de tout ce qui peut ressembler à un cordes, devrions-nous qu'avec des cordes? Une adresse e-mail a des propriétés différentes d'une chaîne de caractères. "[email protected]" peut-être une adresse e-mail et un string, "poisson" ne peut pas être une adresse de courriel. Un nom d'hôte de la propriété ou une CheckMxRecord méthode fait plus de sens pour une adresse e-mail qu'une chaîne de caractères. Dans le même temps, il est assez proche d'une ficelle pour faire la conversion implicite raisonnable. Pas sûr que c'est une bonne idée (besoin d'en connaître plus sur la classe et de son utilisation), mais il n'est certainement pas automatiquement une mauvaise.
- Bien ce que je voulais, c'était seulement une classe d'vérifiez que la "chaîne" qui est entré est vérifié comme une adresse e-mail valide. Et puis j'ai pensé qu'il serait plus facile de faire alternativ 1 au lieu de alternativ 2.
- Au contraire, c'est une très bonne idée. J'ai besoin de ce tous les temps lorsque vous travaillez avec DDD code. Un type fort contribue à faire une différence entre un "prénom" et "nom", par exemple... Dans le bon vieux pascal il y a un
type MyType = type string;
qui permet à cette même directement. Je m'ennuie de cette en C#. Je comprends la question, et que la création d'une nouvelle classe dans de tels cas pourraient être évités. - Pour tous ceux qui pense que c'est un mauvaise idée, de considérer les Énumérations. Une part importante de la valeur de l'Option est d'ajouter des informations de type de ce que sont autrement entiers.
Vous devez vous connecter pour publier un commentaire.
Vous pourrez, avec un implicite de conversion:
Conversions implicites doit être utilisé uniquement si aucune donnée n'est perdue lors de la conversion. Même alors, je vous recommandons d'utiliser cette fonction avec parcimonie, car il peut rendre votre code plus difficile à lire.
Dans cet exemple, l'opérateur implicite renvoie
null
lorsqu'unnull
chaîne est passée. Comme Jon Hanna correctement commenté, il n'est pas souhaitable d'avoir ces deux extraits de code se comportent différemment:EmailAddress x = null;
se comporter différemment desString s = null;EmailAddress x = s;
qui est étrange. Mieux vaut avoir l'implicite de l'opérateur renvoie la valeur null en paramètre null.using EMailAddress = System.String
peut aider); et l'isolement des adresses e-mail à partir d'autres chaînes de sécurité de type. Les conversions implicites complètement la défaite de ce troisième et (OMI) raison la plus importante.Vous le faire en ajoutant un opérateur implicite de la chaîne à votre type personnalisé.
Cependant, je recommande d'utiliser ce avec parcimonie.
Je pense que cette question est un cas particulier d'une question plus générale sur la création de type de sécurité à travers une application en C#. Mon exemple est ici avec 2 types de données: les Prix et le Poids. Ils ont des unités de mesure différentes, donc on ne devrait jamais essayer un attribuer un prix à un poids ou vice versa. Les deux sous les couvertures sont vraiment des valeurs décimales. (Je suis ignorant le fait qu'il pourrait y avoir des conversions de livres en kg, etc.) Cette même idée pourrait être appliquée à des chaînes de caractères avec des types spécifiques comme Adresse de courrier électronique et UserLastName.
Avec assez de chaudière plaque de code, on peut faire une conversion explicite ou implicite, de conversions et-vient entre les types spécifiques: le Prix et le Poids, et le sous-jacent de type Decimal.
Avec le "explicite" de l'opérateur remplace, on obtient un jeu plus restrictif de choses qu'on peut faire avec ces classes. Vous devez être manuellement chaque fois que vous changez de type de l'un à l'autre. Par exemple:
Simplement de changer le "explicite" opérateurs "implicite" des opérateurs en remplaçant les mots "explicite" avec "implicite" dans le code, on peut convertir en arrière et en avant de la sous-classe Decimal sans travail supplémentaire. De ce fait le Prix et le Poids se comportent plus comme une Virgule, mais vous ne pouvez toujours pas de changement de Prix pour un Poids. C'est généralement le niveau de sécurité de type je suis à la recherche d'.
Lorsque vous faites cela pour la Chaîne, au lieu de la Virgule. J'aime l'idée Thorarin, en réponse à la vérification de la valeur null et en passant null retour dans la conversion. par exemple,
Pour obtenir ces classes de travail que les clés de Dictionnaire des collections, vous aurez également besoin de mettre en œuvre des Égaux, GetHashCode, l'opérateur = = et l'opérateur !=
Pour rendre tout cela plus facile, j'ai fait une classe ValueType qui je peux prolonger, Le ValueType classe appelle le type de base pour tout, mais les opérateurs de conversion.
Exemple:
Comme vous l'avez remarqué que vous ne pouvez pas hériter de la chaîne, mais vous pouvez l'étendre avec des méthodes d'extension.
De sorte que vous pouvez faire de courriel spécifique de l'extension des méthodes pour gérer tout ce que vous pensiez de la mise dans l'e-mail de classe.
System.String
par le biais de méthodes d'extension. Cependant, il est assez décentMailAddress
classe 🙂Je crois que je vois ce que vous essayez de faire. Mais vous ne pouvez pas sous-classe
string
dans .NET. Parfois je regrettais de ne pas sous-classe intégrée de types tels queint
, mais bien sûr ce n'est pas possible non plus (quoique pour d'autres raisons techniques).Alors que vous pourriez théoriquement utiliser un
implicit operator
méthode de conversion, comme suggéré par d'autres ici, il y a quelques problèmes avec ceux qui, comme bizarre de conversion de type d'erreurs du compilateur. Cette solution n'a pas très bien fonctionné pour moi.Ce que vous voyez habituellement dans la BCL dans des scénarios similaires — c'est à dire quand un type spécialisé doit "sentir" comme le type il est basé sur un type personnalisé d'avoir un
Value
propriété. (Les deux exemples qui viennent à l'esprit sontSystem.Nullable<T>
,System.Lazy<T>
.) Ce n'est pas aussi élégant, mais il fonctionne.