quelle est la différence entre le défaut et le constructeur par défaut
j'ai une classe nommée A
. Quelle est la différence entre ces deux déclarations?
A a = new A();
A a = default(A);
3 réponses
cela crée une nouvelle instance du type A
en appelant le constructeur par défaut, parameterless:
A a = new A();
cela assigne la valeur par défaut pour le type A
à la variable a
et n'appelle pas de tout constructeur:
A a = default(A);
La principale différence est que la valeur par défaut d'un type est null
pour les types de référence et une valeur zéro-bit pour tous les types de valeur (donc default(int)
0
,default(bool)
false
, etc.).
pour les types de valeur il n'y a pas de différence, puisque le constructeur par défaut d'un type de valeur est toujours équivalent à default(T). Il se remplit peu à tout avec 0
,null
,0.0
... Dans l'implémentation par défaut de .net cela correspond juste à remplir tout dans votre variable avec le zéro binaire.
pour les types de référence new T()
appelle le constructeur par défaut et renvoie une référence (habituellement) non nulle.default(T)
d'autre part est équivalent à null
dans ce cas.
default(T)
est important car il représente une valeur valide de T, Que T soit un type de référence ou de valeur. Ceci est très utile dans la programmation générique.
Par exemple, dans les fonctions de la forme FirstOrDefault
vous avez besoin d'une valeur valide pour votre résultat dans le cas où l'énumérable n'a pas d'entrées. Et il suffit d'utiliser default(T)
pour que, puisque c'est la seule chose valable pour chaque type.
appelant en plus le constructeur par défaut sur les types de référence nécessitent une contrainte Générique. Et ce n'est pas chaque type de référence qui implémente un constructeur par défaut. Donc tu ne peux pas toujours l'utiliser.
le nouveau mot-clé indique toujours l'attribution de la mémoire pour les types de référence. Aucune autre construction ne crée réellement d'espace en mémoire pour les données que vous êtes sur le point de créer. Pour les types de valeur, leur mémoire est toujours pré-alloués dans une fonction ou une procédure. default
le mot-clé permet à un type générique de retourner sa valeur par défaut (non initialisée), ou null
pour les types de référence.