Quelle est la valeur par défaut du type Nullable "int?" (y compris le point d'interrogation)?

102

En C #, quelle est la valeur par défaut d'une variable d'instance de classe de type int??

Par exemple, dans le code suivant, quelle valeur aura MyNullableIntsi elle n'est jamais explicitement attribuée?

class MyClass
{
    public int? MyNullableInt;
}

(Il semble probable que la réponse soit presque certainement soit nullou 0, mais laquelle de ces réponses ?)

Jon Schneider
la source
9
Pourquoi le vote négatif? (La réponse à cette question ne m'était pas évidente au départ sans exécuter le code pour tester le comportement; et étonnamment, je n'ai pas pu trouver un double de cette question sur StackOverflow, ou facilement trouver ailleurs via Google.)
Jon Schneider
1
Vous auriez pu regarder ici - premier coup de Google pour moi.
500 - Erreur de serveur interne
2
@ 500 - J'ai trouvé cet article lors de mes recherches - je l'ai en fait lié dans ma propre réponse ci-dessous - mais pour autant que je sache, l'article n'indique pas explicitement que la valeur par défaut d'une instance de type Nullable est nul. Il ne dit « La valeur par défaut pour HasValue est faux. Biens dont la valeur n'a pas de valeur par défaut », mais cela ne répond pas directement à ma question initiale sans quelques recherches supplémentaires.
Jon Schneider
2
Je me demande si c'était parce que vous pouviez simplement définir un point d'arrêt et voir quelle est la valeur, ou dans le type Fenêtre immédiate int? x;et voir quel est le résultat?
Rufus L

Réponses:

136

La valeur par défaut pour int?- et pour tout type Nullable qui utilise le "type?" déclaration - est null.

Pourquoi c'est le cas:

  • int?est le sucre syntaxique pour le type Nullable <T> (où T est int), une structure. ( référence )
  • Le Nullable<T>type a un membre booléen HasValue , qui, quand false, fait Nullable<T>«agir» l' instance comme une nullvaleur. En particulier, la méthode Nullable <T> .Equals est remplacée pour retourner truequand un Nullable<T>with HasValue == falseest comparé à une nullvaleur réelle .
  • À partir de la spécification 11.3.4 du langage C # , la valeur par défaut initiale d'une instance de struct est tous les champs de type valeur de cette structure définis sur leur valeur par défaut, et tous les champs de type de référence de cette structure définis sur null.
  • La valeur par défaut d'une boolvariable en C # est false ( référence ). Par conséquent, la HasValuepropriété d'une Nullable<T>instance par défaut est false; ce qui à son tour fait Nullable<T>agir cette instance elle-même null.
Jon Schneider
la source
Lorsque je change une déclaration de int? x = null;à int? x;, j'obtiens des erreurs de compilation plus bas dans le code: "Utilisation de la variable locale x non attribuée".
John Pick le
1
@JohnPick C'est une fonctionnalité du compilateur C # destinée à éviter les bogues qui pourraient survenir si vous "oubliez" d'initialiser une variable avant de l'utiliser. Une situation où vous pouvez rencontrer un int non initialisé? est quand c'est une variable membre de classe. Exemples des deux ici: blogs.msdn.microsoft.com/abhinaba/2005/11/08/…
Jon Schneider
Donc, fondamentalement, cet endroit est votre blog technologique? Vous posez des questions pour lesquelles il vous suffit d'exécuter le code pour obtenir la réponse, puis répondez vous-même à la question dans la même minute.
GôTô
4
@JonSchneider assez juste, mon mauvais alors
GôTô
Indice compilateur / l'avertissement de VS est trompeur: Field 'id' is never assigned to, and will always have its default value 0. Bizarre n'est-ce pas?
Hendy Irawan
32

Je me suis senti important de partager la Nullable<T>.GetValueOrDefault()méthode qui est particulièrement pratique lorsque vous travaillez avec des calculs mathématiques utilisant des valeurs Nullable<int>aka int?. Il HasValuearrive souvent que vous n'ayez pas à vérifier la propriété et que vous puissiez simplement l'utiliser à la GetValueOrDefault()place.

var defaultValueOfNullableInt = default(int?);
Console.WriteLine("defaultValueOfNullableInt == {0}", (defaultValueOfNullableInt == null) ? "null" : defaultValueOfNullableInt.ToString());

var defaultValueOfInt = default(int);
Console.WriteLine("defaultValueOfInt == {0}", defaultValueOfInt);

Console.WriteLine("defaultValueOfNullableInt.GetValueOrDefault == {0}", defaultValueOfNullableInt.GetValueOrDefault());

Ligne de commande montrant le code ci-dessus fonctionnant

Brian Ogden
la source
0
var x = default (int?);
Console.WriteLine("x == {0}", (x == null) ? "null" : x.ToString());
Rufus L
la source