2015-03-19 13 views
55

In C#, was ist der Standardwert einer Klasseninstanzvariable vom Typ int??Wie lautet der Standardwert des Nullable-Typs "int?" (einschließlich Fragezeichen)?

Zum Beispiel, in dem folgenden Code, welcher Wert wird MyNullableInt haben, wenn es nie explizit zugewiesen ist?

class MyClass 
{ 
    public int? MyNullableInt; 
} 

(Es scheint wahrscheinlich, dass die Antwort an Sicherheit grenzender Wahrscheinlichkeit entweder null oder 0, die aber von denen ist es?)

+4

Warum die downvote? (Die Antwort auf diese Frage war für mich zunächst nicht offensichtlich, ohne den Code tatsächlich auszuführen, um das Verhalten zu testen; und überraschenderweise konnte ich in StackOverflow kein Duplikat dieser Frage finden oder anderswo über Google leicht finden.) –

+0

Sie könnten habe [hier] geschaut (https://msdn.microsoft.com/en-us/library/1t3y8s4s.aspx) - erster google hit für mich. –

+1

@ 500 - Ich habe diesen Artikel gefunden, als ich recherchierte - ich habe tatsächlich in meiner eigenen Antwort darunter verlinkt - aber soweit ich das beurteilen kann, gibt der Artikel nicht explizit den Standardwert eines nullbaren Typs an Instanz ist null. Es * sagt * "Der Standardwert für HasValue ist falsch. Die Value-Eigenschaft hat keinen Standardwert", aber das beantwortet meine ursprüngliche Frage nicht ohne zusätzliches Graben. –

Antwort

80

Der Standardwert für int? - und für jede Nullable Type, die verwendet die " Art?" Erklärung - ist null.

Warum dies der Fall ist:

  • int? ist syntaktischer Zucker für den Typ Nullable<T> (wobei T int), eine Struktur. (reference)
  • Der Nullable<T> Typ hat ein bool HasValue Glied, das, wenn false, macht die Nullable<T> instance "wirkt wie ein" null Wert. Insbesondere wird überschrieben, um true zurückzugeben, wenn ein Nullable<T> mit HasValue == false mit einem tatsächlichen null Wert verglichen wird.
  • Aus dem C# Language Specification 11.3.4, einem initialen Standardwert einer Strukturinstanz, sind alle Werttypfelder dieses Struct auf ihren Standardwert gesetzt, und alle Felder dieses Referenztyps der Struktur sind auf null festgelegt.
  • Der Standardwert einer bool Variablen in C# ist false (reference). Daher ist die HasValue Eigenschaft einer Standard Nullable<T> Instanz false; was wiederum dazu führt, dass die Nullable<T> Instanz sich wie null verhält.
+0

Wenn ich eine Deklaration von 'int ändere? x = null; 'zu' int? x; ', ich bekomme Compilerfehler weiter unten im Code:" Verwendung der nicht zugewiesenen lokalen Variablen x ". –

+0

@ JohnPick Das ist eine C# -Compiler-Funktion, die dazu dienen soll, Fehler zu verhindern, die entstehen können, wenn Sie "vergessen", eine Variable zu initialisieren, bevor Sie sie verwenden. Eine Situation, in der du auf einen nicht initialisierten int stoßen kannst? ist, wenn es eine Klassenmitgliedsvariable ist. Beispiele für beide hier: https://blogs.msdn.microsoft.com/abhinaba/2005/11/08/c-uninitialized-instance-variables/ –

+0

Also im Grunde ist dieser Ort Ihre Tech-Blog? Sie stellen Fragen, für die Sie nur den Code ausführen müssen, um die Antwort zu erhalten, und beantworten dann die Frage selbst in derselben Minute. –

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

Ich fühlte mich wichtig, die Nullable<T>.GetValueOrDefault() Methode, die besonders praktisch ist, zu teilen, wenn sie mit Mathe Berechnungen arbeiten, die Nullable<int> aka int? Werte verwenden. Es gibt viele Male, wenn Sie nicht überprüfen müssen HasValue Eigentum und Sie können stattdessen GetValueOrDefault() verwenden.

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

Verwandte Themen