Qual è lo scopo di un punto interrogativo dopo un tipo (ad esempio: int? MyVariable)?


433

Tipicamente l'uso principale del punto interrogativo è per il condizionale x ? "yes" : "no",.

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

public int? myProperty
{
   get;
   set;
}

Risposte:


438

Significa che il tipo di valore in questione è un tipo nullable

I tipi nullable sono istanze della struttura System.Nullable. Un tipo nullable può rappresentare l'intervallo di valori corretto per il tipo di valore sottostante, oltre a un valore null aggiuntivo. Ad esempio, a Nullable<Int32>, pronunciato "Nullable of Int32", può essere assegnato qualsiasi valore compreso tra -2147483648 e 2147483647 oppure può essere assegnato il valore null. A è Nullable<bool>possibile assegnare i valori true, false o null. La possibilità di assegnare null a tipi numerici e booleani è particolarmente utile quando si ha a che fare con database e altri tipi di dati che contengono elementi a cui potrebbe non essere assegnato un valore. Ad esempio, un campo booleano in un database può archiviare i valori vero o falso oppure potrebbe non essere definito.

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

3
Utilizzato per Struct. Non pensare che sia effettivamente utile per le lezioni.
— Monsieur,

8
@MonsieurDart - ecco perché la risposta dice "tipo di valore"
— Sean,

3
@AntoineDahan - i tipi di valori non hanno tipi nullable poiché sono per definizione non nullable. Penso che tu stia pensando a Java dove c'è un inttipo e una Integerclasse corrispondente , per esempio.
— Sean,

2
documentazione più recente (2015) per il tipo nullable qui
— dinosauro

2
Si noti inoltre che il punto interrogativo può seguire un oggetto (istanza di un tipo) in c # 6 (VS 2015)
— Zim

119

È una scorciatoia per Nullable<int>. Nullable<T>viene utilizzato per consentire l'impostazione di un tipo di valore null. I tipi di valore in genere non possono essere nulli .


3
più uno per l'uso del termine stenografia, piuttosto semplice!
— Hari,

3
La seconda frase mi confonde. Cosa intendi con "impossibile"? A livello di compilatore o nel contesto dell'applicazione.
— problemofficer,

5
@problemofficer per definizione, value typesnon può essere nullo. Se dichiarate un int o un bool (che sono tipi di valore) senza assegnare specificatamente un valore, avrebbero comunque valori (0 e false, rispettivamente), cioè. non sarebbero nulli. Non assegnato reference types, come oggetto o MyClass, sarà invece nullo. Potresti voler leggere la differenza tra tipi di valore e tipi di riferimento.
— Klaus Byskov Pedersen,

Grazie per la spiegazione. Ora capisco.
— problemofficer

62

In

x ? "yes" : "no"

il ? dichiara una frase if . Qui: x rappresenta la condizione booleana; La parte prima di : è la frase then e la parte dopo è la frase else .

In, ad esempio,

int?

il ? dichiara un tipo nullable e indica che il tipo prima può avere un valore null.


9
Non vedo alcuna relazione tra il '?' dichiarando un tipo null-grado e un'espressione ternaria. Votare la tua risposta, signore.
— Gus Crawford,

36
Non sono d'accordo con il commento sopra di Gus. La domanda mostra che esiste una possibile confusione con l'espressione ternaria. Questa risposta risolve questo problema.
— Mario Levesque,

Dove useresti questo tipo di confronto null? All'interno di un ritorno sembra non essere permesso. return value ? value : "isNull";mi dice che string valuenon è convertibile in bool.
— C4d

Devo dire che questa è una risposta molto contorta, soprattutto se confrontata con altre su questa domanda. -1
— FastTrack

Questa dovrebbe essere la risposta accettata. Dal momento che è chiaro e preciso. +1
— JP Dolocanog,

49

Tipi nullabili

I tipi nullable sono istanze della struttura System.Nullable. Un tipo nullable può rappresentare l'intervallo normale di valori per il tipo di valore sottostante, oltre a un valore null aggiuntivo . Ad esempio, a [ Nullable<Int32>], pronunciato "Nullable of Int32", può essere assegnato qualsiasi valore compreso tra -2147483648 e 2147483647 oppure può essere assegnato il valore null. A [ Nullable<bool>] possono essere assegnati i valori true o false o null. La possibilità di assegnare null a tipi numerici e booleani è particolarmente utile quando si ha a che fare con database e altri tipi di dati contenenti elementi a cui non può essere assegnato un valore. Ad esempio, un campo booleano in un database può archiviare i valori vero o falso oppure potrebbe non essere definito.



6

uso pratico:

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

  return someFunctionThatHandlesIntAndReturnsString(value);
}

1
Mentre il PO è ancora attivo, 5 anni dopo la domanda, la risposta potrebbe non essere più pertinente.
— Fragola,

10
per me è stato 3 ore fa :-)
— AJBauer il

3

Per aggiungere le risposte 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;
    }
}

Ciò darebbe un errore di compilazione:

Errore 12 Impossibile convertire null in 'Test' perché è un tipo di valore non annullabile

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


2

int?è una scorciatoia per Nullable<int>. Le due forme sono intercambiabili.

Nullable<T>è un operatore che è possibile utilizzare con un tipo di valore Tper farlo accettare null.

Nel caso non lo sapessi: il valore tipi sono tipi che accetta valori come int, bool, charecc ...

Non possono accettare riferimenti a valori: genererebbero un errore in fase di compilazione se si assegnasse loro un null, al contrario dei tipi di riferimento , che ovviamente possono accettarlo.

Perché ne avresti bisogno? Perché a volte le variabili del tipo di valore potrebbero ricevere riferimenti null restituiti da qualcosa che non ha funzionato molto bene, come una variabile mancante o indefinita restituita da un database.

Ti consiglio di leggere la Documentazione Microsoft perché tratta abbastanza bene l'argomento.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.