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.