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);
10
demandé sur Andrew Hare 2010-11-28 04:51:24

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

13
répondu Andrew Hare 2010-11-28 01:54:38

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.

2
répondu CodesInChaos 2010-11-28 09:46:52

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.

0
répondu ja72 2010-11-28 02:01:55