Le moyen privilégié pour définir les valeurs par défaut de nullable propriétés?
Je suis dans un dilemme. L' (réduit) tâche est de redessiner les données suivantes titulaire de classe
class Stuff
{
public String SomeInfo { get; set; }
}
pour répondre à la demande que null ne doit pas être retourné. Je pense à deux façons de réaliser cela et après réflexion profonde de 15 minutes, j'ai simplement ne peut pas décider de ce qui est préféré.
Approche par le constructeur.
class Stuff
{
public String SomeInfo { get; set; }
public Stuff() { SomeInfo = String.Empty; }
}
Approche par la propriété.
class Stuff
{
private String _SomeInfo;
public String SomeInfo
{
get { return _SomeInfo ?? String.Empty; }
set { _SomeInfo = value; }
}
}
Noter que la création de la Trucs instances qui pourrait être fait en utilisant le constructeur ainsi que de l'initialisation, si c'est de toute importance. Pour autant que je suis informé, il n'y aura pas d'autres restrictions (mais vous savez comment les clients spécifications reflètent pas toujours la réalité).
Si par l'initialisation de vous dire une certaine forme de désérialisation être conscient que certaines implémentations de l'habitude d'exécuter le code du constructeur.
Un autre petit goût de #2 peut-être pour valider la saisie lors de la définition de la valeur plutôt que lors de la récupération. Si vous trouvez que vous êtes à la récupération de
null/Empty
valeurs très souvent, au lieu de faire le vérifier une fois/rarement lors de la configuration pourrait être préférée. EDIT: Notez que ceci suppose que vous êtes vigilant suffit pas à définir le champ de stockage à null.Les bons points. Merci!
OriginalL'auteur Konrad Viltersten | 2013-06-12
Vous devez vous connecter pour publier un commentaire.
Vous pouvez seulement de s'assurer que
null
n'est jamais retourné lorsque vous utilisez la propriété:La même approche est utilisée par le texte-contrôles(par exemple, dans ASP.NET) où la
Text
propriété ne retourne jamaisnull
maisString.Empty
.Par exemple(ILSpy):
OriginalL'auteur Rango
Vous pouvez également implémenter la logique dans le setter plutôt que dans de la lecture, de cette façon, votre terrain, a toujours une valeur valide
if
case pour définirString.Empty
au lieu de ne rien faire. Par exemple:myStuff.SomeInfo = "Hello!"; myStuff.SomeInfo = null; Console.WriteLine(myStuff.SomeInfo); //prints Hello!
EDIT: Probablement aussi simple que_someInfo = value ?? String.Empty;
Je pense que c'est vraiment à la hauteur de l'OP. On pourrait aussi décider de lancer une exception dans le cas d'une erreur...
+1 je suis d'accord qu'il y a un peu d'options. J'ai seulement suggéré, car l'attribution de
String.Empty
serait cohérent avec le comportement de l'OP est en train de démontrer maintenant.Je pense que c'est null tout au début, avant toute cession, n'est-ce pas. Bien sûr, je comprends votre point de vue et je trouve qu'il valide. Cependant, je crois qu'il aurait encore besoin d'un protecteur à la fois sur les setter et getter. Et depuis getter par elle-même suffisante, le setter de la fonction de protection est rendu inutile, n'est-ce pas? N'ai pas essayé dans le code - je viens juste de trouver ici.
il n'est pas null, il est initialisé à vide
OriginalL'auteur vc 74
Juste pour ajouter une autre réponse à cela, vous pouvez également définir une valeur par défaut pour un objet chaîne de caractères en une seule instruction;
OriginalL'auteur uk2k05