J'ai une classe nommée A
. Quelle est la différence entre ces deux déclarations?Quelle est la différence entre le constructeur par défaut et par défaut
A a = new A();
A a = default(A);
J'ai une classe nommée A
. Quelle est la différence entre ces deux déclarations?Quelle est la différence entre le constructeur par défaut et par défaut
A a = new A();
A a = default(A);
Cela crée une nouvelle instance du type A
en appelant la valeur par défaut, constructeur sans paramètre:
A a = new A();
Cela affecte la valeur par défaut pour le type A
à la a
variable et ne remet pas constructeur à tous:
A a = default(A);
la principale différence est que la valeur par défaut d'un type est null
pour référen Ces types et une valeur de zéro-bit pour tous les types de valeur (donc default(int)
serait 0
, default(bool)
serait false
, etc.).
Le nouveau mot-clé signale toujours l'allocation de 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ée lorsqu'elle est utilisée dans une fonction ou une procédure. Le mot clé default
permet à un type générique de renvoyer sa valeur par défaut (non initialisée) ou null
pour les types de référence.
La valeur par défaut des types de valeur n'est PAS non initialisée. Il est initialisé à zéro. – CodesInChaos
Vous avez raison, mais ce que je voulais dire par non initialisé, n'est pas initialisé par l'utilisateur (comme 'int i = 100;'), mais par le compilateur. Désolé pour la confusion. – ja72
Pour les types de valeur, il n'y a pas de différence, car le constructeur par défaut d'un type de valeur est toujours équivalent à la valeur par défaut (T). Il remplit simplement tout avec 0
, null
, 0.0
... Dans l'implémentation par défaut de .net, cela correspond simplement à remplir tout le contenu de votre variable avec un zéro binaire.
Pour les types de référence, new T()
appelle le constructeur par défaut et renvoie une référence (généralement) non nulle. 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 un type de valeur. Ceci est très utile dans la programmation générique.
Par exemple dans les fonctions FirstOrDefault
vous avez besoin d'une valeur valide pour votre résultat dans le cas où l'énumérable n'a aucune entrée. Et vous utilisez juste default(T)
pour cela puisque c'est la seule chose valable pour tous les types.
L'appel du constructeur par défaut sur les types de référence requiert en outre une contrainte générique. Et pas tous les types de références implémente un constructeur par défaut. Donc vous ne pouvez pas toujours l'utiliser.
@Fermaref - Je ne sais pas où vous avez trouvé cela. L'instruction 'var x = default (TestClass);' assigne 'null' à' x' –
okay, j'ai attrapé mon erreur. Je lui ai renseigné un paramètre de valeur de type quand j'ai essayé de l'utiliser, pas le nom du type, et cela ne fonctionne que dans les génériques. Je suis désolé. – Femaref