web-dev-qa-db-fra.com

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?

52
Benny

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.

60
David Hedlund

La valeur par défaut de class est un null

14
Graviton

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

11
Peter

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.

7
Konamiman

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
}
3
Yom S.

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.

3
Darin Dimitrov
Assert.IsTrue(default(MyClass) == null);
2
Bryan Watts

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:

  1. 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.

  2. 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.

1
AndyClaw