2015-03-19 8 views
55

In C#, qual è il valore predefinito di una variabile di istanza di classe di tipo int??Qual è il valore predefinito del tipo nullable "int?" (compreso il punto interrogativo)?

Ad esempio, nel seguente codice, quale valore avrà MyNullableInt se non viene mai assegnato in modo esplicito?

class MyClass 
{ 
    public int? MyNullableInt; 
} 

(sembra probabile che la risposta è quasi certamente sia null o 0, ma che di questi si tratta?)

+4

Perché il downvote? (La risposta a questa domanda non era inizialmente ovvia per me senza aver effettivamente eseguito il codice per testare il comportamento, e sorprendentemente, non ho trovato un duplicato di questa domanda su StackOverflow, o facilmente reperibile altrove tramite Google.) –

+0

ho guardato [qui] (https://msdn.microsoft.com/en-us/library/1t3y8s4s.aspx) - prima hit di Google per me. –

+1

@ 500 - Ho trovato quell'articolo mentre stavo ricercando - in realtà ho collegato ad esso nella mia risposta di seguito - ma per quanto posso dire, l'articolo non afferma esplicitamente che il valore predefinito di un tipo nullable l'istanza è nulla. * * * Dice "Il valore predefinito per HasValue è falso.La proprietà Value non ha valore predefinito", ma questo non risponde direttamente alla mia domanda originale senza ulteriori scavi. –

risposta

80

Il valore predefinito per int? - e per qualsiasi tipo nullable che utilizza il " genere?" dichiarazione - è null.

Perché questo è il caso:

  • int? è zucchero sintattico per il tipo di Nullable<T> (dove T è int), una struttura. (reference)
  • Il tipo Nullable<T> presenta un organo bool HasValue, che quando false, rende il "agire come" Nullable<T> esempio un valore null. In particolare, lo Nullable<T>.Equals method viene sostituito per restituire true quando uno Nullable<T> con HasValue == false viene confrontato con un valore effettivo null.
  • Da C# Language Specification 11.3.4, il valore di default iniziale di una istanza di struct è costituito da tutti i campi del tipo di valore di struct impostati sul valore predefinito e tutti i campi del tipo di riferimento di struct impostati su null.
  • Il valore predefinito di una variabile bool in C# è false (reference). Pertanto, la proprietà HasValue di un'istanza predefinita Nullable<T> è false; che a sua volta rende l'istanza di Nullable<T> stessa come null.
+0

Quando cambio una dichiarazione da 'int? x = null; 'a' int? x; ', ottengo gli errori del compilatore più in basso nel codice:" Uso della variabile locale non assegnata x ". –

+0

@JohnPick Questa è una funzione del compilatore C# che intende prevenire i bug che potrebbero derivare dal "dimenticare" di inizializzare una variabile prima di utilizzarla. Una situazione in cui * puoi * incontrare un int non inizializzato? è quando è una variabile membro della classe. Esempi di entrambi qui: https://blogs.msdn.microsoft.com/abhinaba/2005/11/08/c-uninitialized-instance-variables/ –

+0

Quindi in pratica questo posto è il tuo blog di tecnologia? Poni domande per le quali hai solo bisogno di eseguire il codice per ottenere la risposta, quindi rispondi tu stesso alla domanda nello stesso minuto. –

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

mi sentivo importante condividere il metodo Nullable<T>.GetValueOrDefault() che è particolarmente utile quando si lavora con i calcoli matematici che utilizzano Nullable<int> aka int? valori. Ci sono molte volte in cui non devi controllare la proprietà HasValue e puoi semplicemente usare GetValueOrDefault().

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

Problemi correlati