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?
Pour synchroniser avec le reste, ce sera null
, mais je dois également 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 voudrez peut-être renvoyer default(T)
, si votre type de retour est T
et que vous ne voulez pas supposer qu'il est nullable.
La valeur par défaut de class
est un null
Remarque: Un DefaultValueAttribute ne provoquera 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 l'ajouter comme information pertinente.
Pour plus d'informations, voir http://msdn.Microsoft.com/en-us/library/system.componentmodel.defaultvalueattribute.aspx
La valeur par défaut des 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 annulé en passant). La même règle est appliquée récursivement à tous les champs contenus dans la classe ou la structure.
Je ferais de cette instance de classe "par défaut" un champ plutôt qu'une propriété, comme la façon dont System.String.Empty
regards:
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
}
S'il s'agit d'un type de référence, la valeur par défaut sera null
, s'il s'agit d'un type de valeur, cela dépend.
Assert.IsTrue(default(MyClass) == null);
Si vous cherchez à définir d'une manière ou d'une autre une valeur par défaut non nulle pour un type de référence, sachez qu'il ne serait pas logique qu'un type de référence ait 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éfinissez une instance statique comme valeur par défaut: cela pourrait fonctionner mais nécessiterait probablement un moyen vraiment maladroit d'identifier en quelque sorte le compilateur où obtenir l'instance statique. Pas vraiment une fonctionnalité qui mérite 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 car vous n'avez pas remplacé Equals pour ne pas comparer les références, et aussi terrible à cause de la les performances de gestion de la mémoire et d'allocation de mémoire sont atteintes, et les effets secondaires du constructeur.
Donc, en résumé, je pense que c'est une fonctionnalité linguistique que nous ne voulons vraiment pas. Et par défaut (MyClass) sera toujours == null.