2010-04-22 4 views
325

Normalerweise wird das Fragezeichen hauptsächlich für die Bedingung x ? "yes" : "no" verwendet.Was ist der Zweck eines Fragezeichens nach einem Typ (zum Beispiel: int? MyVariable)?

Aber ich habe eine andere Verwendung dafür gesehen, kann aber keine Erklärung für diese Verwendung des ? Operators finden, zum Beispiel.

public int? myProperty 
{ 
    get; 
    set; 
} 
+0

groß, vielen Dank jeder – GenEric35

+0

möglich Duplikat [Was bedeutet „Datetime?“ meinst du in C#?] (http://stackoverflow.com/questions/109859/what-does-datetime-mean-in-c) –

Antwort

333

Es bedeutet, dass der Wert in Rede stehenden Art eine nullable type

Nullable types are instances of the System.Nullable struct. A nullable type can represent the correct range of values for its underlying value type, plus an additional null value. For example, a Nullable, pronounced "Nullable of Int32," can be assigned any value from -2147483648 to 2147483647, or it can be assigned the null value. A Nullable can be assigned the values true, false, or null. The ability to assign null to numeric and Boolean types is especially useful when you are dealing with databases and other data types that contain elements that may not be assigned a value. For example, a Boolean field in a database can store the values true or false, or it may be undefined.

class NullableExample 
{ 
    static void Main() 
    { 
     int? num = null; 

     // Is the HasValue property true? 
     if (num.HasValue) 
     { 
      System.Console.WriteLine("num = " + num.Value); 
     } 
     else 
     { 
      System.Console.WriteLine("num = Null"); 
     } 

     // y is set to zero 
     int y = num.GetValueOrDefault(); 

     // num.Value throws an InvalidOperationException if num.HasValue is false 
     try 
     { 
      y = num.Value; 
     } 
     catch (System.InvalidOperationException e) 
     { 
      System.Console.WriteLine(e.Message); 
     } 
    } 
} 
+2

Wird für Struktur verwendet. Denke nicht, dass es für Klassen wirklich nützlich ist. – MonsieurDart

+7

@MonsieurDart - deshalb sagt die Antwort "Werttyp" – Sean

+0

Warum hat C# dies, wenn die meisten Primitiven bereits einen nullbaren Typ haben (zB: int/Integer, double/Double, etc.)? –

9

deklariert, dass der Typ nullfähig ist.

+2

Dein erster Eintrag macht keinen Sinn, wenn man das asker-Beispiel betrachtet. –

94

Es ist eine Kurzschrift für Nullable<int>. Nullable<T> wird mit Werttypen verwendet, die nicht null sein können.

+3

plus eins für die Verwendung des Begriffs shorthand, Pretty straight forward! – Hari

+1

Der zweite Satz verwirrt mich. Was meinst du mit "kann nicht"? Auf der Compiler-Ebene oder im Anwendungskontext. – problemofficer

+3

@problemofficer pro Definition, 'Werttypen' kann nicht null sein.Wenn Sie ein int oder ein bool deklarieren (welche Werttypen sind), ohne einen Wert spezifisch zuzuweisen, hätten sie immer noch Werte (0 bzw. false), d. Sie wären nicht null. Nicht zugewiesene 'Referenztypen' wie Objekt oder MyClass sind dagegen null. Vielleicht möchten Sie sich über den Unterschied zwischen Werttypen und Referenztypen informieren. –

43

Nullable Types

Nullable types are instances of the System.Nullable struct. A nullable type can represent the normal range of values for its underlying value type, plus an additional null value. For example, a [ Nullable<Int32> ], pronounced "Nullable of Int32," can be assigned any value from -2147483648 to 2147483647, or it can be assigned the null value. A [ Nullable<bool> ] can be assigned the values true or false, or null. The ability to assign null to numeric and Boolean types is particularly useful when dealing with databases and other data types containing elements that may not be assigned a value. For example, a Boolean field in a database can store the values true or false, or it may be undefined.

45

In

x ? "yes" : "no" 

die ist? erklärt einen wenn Satz. Hier: x repräsentiert die boolesche Bedingung; Der Teil vor dem : ist der dann Satz und der Teil danach ist der sonst Satz.

In zum Beispiel

int? 

die ? deklariert einen Nullwerttyp und bedeutet, dass der Typ davor einen Nullwert haben kann.

+9

Ich sehe keine Beziehung zwischen dem '?' einen nullfähigen Typ und einen ternären Ausdruck deklarieren. Wählen Sie Ihre Antwort Sir. –

+22

Ich stimme nicht mit dem obigen Kommentar von Gus. Die Frage zeigt, dass eine mögliche Verwechslung mit dem ternären Ausdruck besteht. Diese Antwort behebt dieses Problem. – levteck

+0

Wo würden Sie diese Art des Nullvergleichs verwenden? In einer Rücksendung scheint es nicht erlaubt zu sein. 'Rückgabewert? value: "isNull"; 'sagt mir, dass' string value' nicht in bool umwandelbar ist. – C4u

3

praktische Nutzung:

public string someFunctionThatMayBeCalledWithNullAndReturnsString(int? value) 
{ 
    if (value == null) 
    { 
    return "bad value"; 
    } 

    return someFunctionThatHandlesIntAndReturnsString(value); 
} 
+1

Während das OP noch 5 Jahre nach der Frage aktiv ist, ist die Antwort möglicherweise nicht mehr relevant. – Strawberry

+5

zu mir war es vor 3 Stunden :-) –

2

auf die Antworten oben hinzuzufügen auf, hier ist ein Codebeispiel

struct Test 
{ 
    int something; 
} 
struct NullableTest 
{ 
    int something; 
} 
class Example 
{ 
    public void Demo() 
    { 
     Test t = new Test(); 
     t = null; 

     NullableTest? t2 = new NullableTest(); 
     t2 = null; 
    } 
} 

Diese einen Kompilierungsfehler geben würde:

Error 12 Cannot convert null to 'Test' because it is a non-nullable value type

Beachten Sie, dass Es gibt keinen Kompilierungsfehler für NullableTest. (notieren Sie die? in der Deklaration von t2)

-2

Um ein optionales zu erstellen, fügen Sie eine ? nach dem Typ, den Sie umbrechen möchten. Jeder Typ kann optional sein, sogar Ihre eigenen benutzerdefinierten Typen. Sie können kein Leerzeichen zwischen dem Typ und der haben?.

var name: String? = "Bob" // Create an optional String that contains "Bob" 
var peter: Person? = Person() // An optional "Person" (custom type) 

// A class with a String and an optional String property 
class Car { 
var modelName: String // must exist 
var internalName: String? // may or may not exist 
} 
+0

Ist das in Go geschrieben? Dies hat keine Semikola, und Variablen sind mit var und einem Doppelpunkt definiert. – ProgramFast

+0

@ProgramFast Swift – kezi

+0

@ProgramFast Es ist in Javascript geschrieben. –

Verwandte Themen