Was ist der Standardwert des nullbaren Typs "int"? (einschließlich Fragezeichen)?

100

Was ist in C # der Standardwert einer Klasseninstanzvariablen vom Typ int??

Welchen Wert MyNullableInthat beispielsweise im folgenden Code, wenn er niemals explizit zugewiesen wird?

class MyClass
{
    public int? MyNullableInt;
}

(Es scheint wahrscheinlich, dass die Antwort mit ziemlicher Sicherheit entweder nulloder ist 0, aber welche davon ist es?)

Jon Schneider
quelle
9
Warum das Downvote? (Die Antwort auf diese Frage war für mich zunächst nicht offensichtlich, ohne den Code zum Testen des Verhaltens auszuführen. Überraschenderweise konnte ich kein Duplikat dieser Frage in StackOverflow finden oder an anderer Stelle über Google leicht finden.)
Jon Schneider
1
Du hättest hier suchen können - erster Google-Hit für mich.
500 - Interner Serverfehler
2
@ 500 - Ich habe diesen Artikel gefunden, als ich recherchiert habe - ich habe ihn tatsächlich in meiner eigenen Antwort unten verlinkt -, aber soweit ich das beurteilen kann, gibt der Artikel nicht explizit an, dass der Standardwert einer Instanz vom Typ nullable ist ist Null. Es wird sagen : „Der Standardwert für HasValue falsch ist. Die Value - Eigenschaft hat keinen Standardwert“, aber das bedeutet nicht direkt meine ursprüngliche Frage ohne einige zusätzliche Grab beantworten.
Jon Schneider
2
Ich frage mich, ob es daran lag, dass Sie einfach einen Haltepunkt setzen und sehen konnten, was der Wert ist, oder im Typ Sofortfenster int? x;und sehen, was das Ergebnis ist.
Rufus L

Antworten:

135

Der Standardwert für int?- und für jeden nullbaren Typ, der den "Typ?" Erklärung - ist null.

Warum dies der Fall ist:

  • int?ist syntaktischer Zucker für den Typ Nullable <T> (wobei T ist int), eine Struktur. ( Referenz )
  • Der Nullable<T>Typ hat ein booles HasValue- Mitglied, falsewodurch die Nullable<T>Instanz bei einem nullWert "wie" wirkt . Insbesondere wird die Methode Nullable <T> .Equals überschrieben, um zurückzugeben, truewenn ein Nullable<T>with HasValue == falsemit einem tatsächlichen nullWert verglichen wird.
  • In der C # -Sprachenspezifikation 11.3.4 sind der anfängliche Standardwert einer Strukturinstanz alle Werttypfelder dieser Struktur, die auf ihren Standardwert festgelegt sind, und alle Referenztypfelder dieser Struktur, die auf festgelegt sind null.
  • Der Standardwert einer boolVariablen in C # ist false ( Referenz ). Daher ist die HasValueEigenschaft eines Standard Nullable<T>ist Instanz false; was wiederum dazu führt, dass sich diese Nullable<T>Instanz selbst so verhält null.
Jon Schneider
quelle
Wenn ich eine Deklaration von int? x = null;nach ändere int? x;, werden weiter unten im Code Compilerfehler angezeigt: "Verwendung der nicht zugewiesenen lokalen Variablen x".
John Pick
1
@JohnPick Dies ist eine C # -Compilerfunktion, die verhindern soll, dass Fehler auftreten, wenn Sie vergessen, eine Variable vor der Verwendung zu initialisieren. Eine Situation, in der Sie auf einen nicht initialisierten Int stoßen können ? ist, wenn es sich um eine Klassenmitgliedsvariable handelt. Beispiele für beides hier: blogs.msdn.microsoft.com/abhinaba/2005/11/08/…
Jon Schneider
Im Grunde genommen ist dieser Ort Ihr Tech-Blog? Sie stellen Fragen, für die Sie nur den Code ausführen müssen, um die Antwort zu erhalten, und beantworten die Frage dann in derselben Minute selbst.
GôTô
4
@ JonSchneider fair genug, mein schlechtes dann
GôTô
Der Compiler-Hinweis / die Warnung von VS ist irreführend : Field 'id' is never assigned to, and will always have its default value 0. Seltsam, nicht wahr?
Hendy Irawan
30

Ich fand es wichtig, die Nullable<T>.GetValueOrDefault()Methode zu teilen , die besonders praktisch ist, wenn ich mit mathematischen Berechnungen arbeite, die Nullable<int>alias int?Werte verwenden. Es gibt viele Fälle, in denen Sie die HasValueEigenschaft nicht überprüfen müssen und GetValueOrDefault()stattdessen einfach verwenden können .

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());

Befehlszeile mit dem obigen Code

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