2010-11-28 11 views

Répondre

13

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

+6

@Fermaref - Je ne sais pas où vous avez trouvé cela. L'instruction 'var x = default (TestClass);' assigne 'null' à' x' –

+0

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

0

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.

+0

La valeur par défaut des types de valeur n'est PAS non initialisée. Il est initialisé à zéro. – CodesInChaos

+0

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

2

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.

Questions connexes