Valeur par défaut pour la classe définie par l'utilisateur en C#
Je vois que du code retournera la valeur par défaut, donc je me demande pour une classe définie par l'utilisateur, comment le compilateur définira-t-il sa valeur par défaut?
8 réponses
Pour entrer dans le reste, ce sera null
, mais je devrais aussi ajouter que vous pouvez obtenir la valeur par défaut de n'importe quel type, en utilisant default
default(MyClass) // null
default(int) // 0
Cela peut être particulièrement utile lorsque vous travaillez avec des génériques; vous pouvez renvoyer default(T)
, si votre type de retour est T
et que vous ne voulez pas supposer qu'il est nullable.
Remarque: Un DefaultValueAttribute ne provoque pas l'initialisation automatique d'un membre avec la valeur de l'attribut. Vous devez définir la valeur initiale dans votre code.
Vous pouvez décorer vos propriétés avec DefaultValueAttribute.
private bool myVal=false;
[DefaultValue(false)]
public bool MyProperty {
get {
return myVal;
}
set {
myVal=value;
}
}
Je sais que cela ne répond pas à votre question, je voulais juste ajouter ceci comme information pertinente.
Pour plus d'informations, voir http://msdn.microsoft.com/en-us/library/system.componentmodel.defaultvalueattribute.aspx
La valeur par défaut pour les classes est null
. Pour les structures, la valeur par défaut est la même que celle que vous obtenez lorsque vous instanciez le constructeur sans paramètre par défaut de la structure (qui ne peut pas être remplacé par ailleurs). La même règle est appliquée récursivement à tous les champs contenus dans la classe ou la structure.
Si c'est un type de référence, la valeur par défaut est null
, si il est une valeur du type, puis elle dépend.
Si vous cherchez à définir une valeur par défaut non nulle pour un type de référence, sachez que cela n'aurait pas de sens pour un type de référence d'avoir une valeur par défaut. À un moment donné, une référence devrait pointer vers la mémoire allouée pour l'objet construit. Pour le rendre possible, j'imagine deux implémentations:
Définir une instance statique par défaut: cela pourrait fonctionner mais nécessiterait probablement un moyen vraiment maladroit d'identifier d'une manière ou d'une autre au compilateur où obtenir l'instance statique. Pas vraiment une fonctionnalité qui vaut la peine d'être mise dans la langue.
Autoriser l'appel du constructeur par défaut chaque fois que la valeur par défaut se produit dans une expression: ce serait terrible car maintenant vous devez vous soucier de deux valeurs par défaut éventuellement inégales parce que vous n'avez pas remplacé les égaux pour ne pas comparer les références, et aussi terrible en raison de la gestion de la mémoire et des performances constructeur.
Donc en résumé je pense que c'est un langage que nous ne voulons pas vraiment. Et default (MyClass) sera toujours = = null.
Je ferais de cette instance de classe "par défaut" un champ plutôt qu'une propriété, comme System.String.Empty
ressemble:
public class Person
{
public string Name { get; set; }
public string Address { get; set; }
public static readonly Person Default = new Person()
{
Name = "Some Name",
Address = "Some Address"
};
}
...
public static void Main(string[] args)
{
string address = String.Empty;
Person person = Person.Default;
//the rest of your code
}