2010-04-22 15 views
325

In genere l'uso principale del punto interrogativo è per il condizionale, x ? "yes" : "no".Qual è lo scopo di un punto interrogativo dopo un tipo (ad esempio: int? MiaVariabile)?

Ma ho visto un altro uso per questo ma non riesco a trovare una spiegazione di questo uso dell'operatore ?, ad esempio.

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

grande, grazie mille a tutti – GenEric35

+0

possibile duplicato del [Che cosa significa "DateTime?" significa in C#?] (http://stackoverflow.com/questions/109859/what-does-datetime-mean-in-c) –

risposta

333

significa che il tipo di valore in questione è un 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

Utilizzato per struct. Non pensare che sia effettivamente utile per le lezioni. – MonsieurDart

+7

@MonsieurDart - ecco perché la risposta dice "tipo di valore" – Sean

+0

Perché C# ha questo quando la maggior parte delle primitive ha già un tipo nullable (Es: int/Integer, double/Double, ecc.)? –

9

dichiara che il tipo è annullabile.

+2

Il tuo primo inserimento non ha senso, dato l'esempio degli utenti. –

94

È una scorciatoia per Nullable<int>. Nullable<T> viene utilizzato con tipi di valori che non possono essere nulli.

+3

più uno per usare il termine stenografia, piuttosto semplice! – Hari

+1

La seconda frase mi confonde. Cosa intendi con "non posso"? A livello di compilatore o nel contesto dell'applicazione. – problemofficer

+3

@problemofficer per definizione, 'tipi di valore' non possono essere nulli.Se dichiari un int o un bool (che sono tipi di valore) senza assegnare specificatamente un valore, avranno comunque valori (0 e false, rispettivamente), es. non sarebbero nulli. D'altra parte, i tipi di riferimento 'non assegnati ', come l'oggetto o MyClass, saranno nulli. Potresti voler leggere la differenza tra i tipi di valore e i tipi di riferimento. –

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" 

il ? dichiara una frase se. Qui: x rappresenta la condizione booleana; La parte precedente allo : è la quindi la frase e la parte successiva è la altra frase.

In, ad esempio,

int? 

il ? dichiara un tipo annullabile e indica che il tipo che precede potrebbe avere un valore nullo.

+9

Non vedo alcuna relazione tra "?" dichiarando un tipo nullo e un'espressione ternaria. Votando la tua risposta, signore. –

+22

Non sono d'accordo con il commento sopra di Gus. La domanda mostra che c'è una possibile confusione con l'espressione ternaria. Questa risposta risolve questo problema. – levteck

+0

Dove useresti questo tipo di confronto nullo? All'interno di un ritorno sembra non essere permesso. 'valore di ritorno? value: "isNull"; 'mi dice che' string value' non è convertibile in bool. – C4u

3

utilizzo pratico:

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

    return someFunctionThatHandlesIntAndReturnsString(value); 
} 
+1

Mentre l'OP è ancora attivo, 5 anni dopo la domanda, la risposta potrebbe non essere più rilevante. – Strawberry

+5

per me è stato 3 ore fa :-) –

2

di aggiungere alle risposte di cui sopra, ecco un esempio di codice

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; 
    } 
} 

Questo darebbe un errore di compilazione:

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

Si noti che non vi è alcun errore di compilazione per NullableTest. (notare il? nella dichiarazione di t2)

-2

Per creare un elemento facoltativo, aggiungere un numero ? dopo il tipo che desideri avvolgere. Qualsiasi tipo può essere facoltativo, anche i tuoi tipi personalizzati. Non è possibile avere uno spazio tra il tipo e lo ?.

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

E 'scritto in Go? Questo non ha punti e virgola e le variabili sono definite con var e due punti. – ProgramFast

+0

@ProgramFast Swift – kezi

+0

@ProgramFast È scritto in javascript. –