web-dev-qa-db-fra.com

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

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 MyNullableInt s'il n'est jamais explicitement attribué?

class MyClass
{
    public int? MyNullableInt;
}

(Il semble probable que la réponse est presque certainement soit null ou 0, mais de qui s'agit-il?)

85
Jon Schneider

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 un sucre syntaxique pour le type Nullable <T> (où T est int), une structure. ( référence )
  • Le Nullable<T> type a un membre bool HasValue , qui, lorsque false, rend le Nullable<T> instance "agit comme" une valeur de null. En particulier, la méthode Nullable <T> .Equals est substituée pour renvoyer true lorsqu’un Nullable<T> avec HasValue == false est comparé à une valeur réelle de null.
  • À partir de Spécification du langage C # 11.3.4 , la valeur par défaut initiale d'une instance de structure correspond à l'ensemble des champs de type valeur de cette structure définis sur leur valeur par défaut, et à tous les champs de type référence de cette structure sur null.
  • La valeur par défaut d'une variable bool dans C # est false ( référence ). Par conséquent, la propriété HasValue d’une valeur par défaut Nullable<T> instance est false; ce qui fait que Nullable<T> _ instance elle-même agit comme null.
119
Jon Schneider

Je me suis senti important de partager la méthode Nullable<T>.GetValueOrDefault(), qui est particulièrement utile lorsque vous travaillez avec des calculs mathématiques qui utilisent les valeurs Nullable<int> Ou int?. Il arrive souvent que vous n'ayez pas à vérifier la propriété HasValue et que vous puissiez simplement utiliser GetValueOrDefault() à la 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());

Command line showing the code above working

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