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?

46
demandé sur Peter Mortensen 2009-12-17 10:53:46

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.

52
répondu David Hedlund 2009-12-17 07:58:10

La valeur par défaut class est un null

13
répondu Graviton 2009-12-17 07:55:12

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

11
répondu Peter 2015-04-27 06:41:09

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.

6
répondu Konamiman 2009-12-17 08:00:33

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.

3
répondu Darin Dimitrov 2009-12-17 07:55:31
Assert.IsTrue(default(MyClass) == null);
2
répondu Bryan Watts 2009-12-17 07:58:33

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:

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

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

1
répondu AndyClaw 2015-04-03 15:01:30

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
}
0
répondu jom 2016-08-25 07:25:07