2010-08-07 13 views

risposta

24

Questo è noto come operatore null coalescenza e agisce come seguendo, assumere a è un int nullable e b è un normale int

b = a ?? 1; 

è uguale

b = (a != null ? (int)a : 1); 

che è uguale a

if(a != null) 
    b = (int)a; 
else 
    b = 1; 

Pertanto

public NameValueCollection Metadata 
{ 
    get { return metadata ?? (metadata = new NameValueCollection()); } 
} 

ampliato dovrebbe assomigliare a qualcosa di simile

public NameValueCollection Metadata 
{ 
    get 
    { 
     if(metadata == null) 
      return (metadata = new NameValueCollection()); 
     else 
      return metadata; 
    } 
} 

che è una sorta di un pattern Singleton uno di linea, perché i rendimenti getter i metadati (un oggetto NameValueCollection inizializzato) ogni volta che vengono richiesti, si aspettano la prima volta che è nullo a quel punto, quindi lo inizializza e poi lo restituisce. Questo è fuori tema ma si noti che questo approccio al modello singleton non è thread-safe.

0

Questo è l'operatore di coalesce, che verifica nullo.

statement ?? fallback se la dichiarazione viene valutata su null, viene utilizzato fallback. Vedi msdn.

-1

?? è il nulla coalescenza operatore

Leggi su di esso qui: link text

+0

downvote perché nessuna spiegazione. – problemofficer

4

?? Operator (C# Reference)

Il ?? l'operatore è chiamato l'operatore null-coalescing e viene utilizzato per definire un valore predefinito per un tipo di valore nullable nonché per i tipi di riferimento . Restituisce l'operando sinistro se non è nullo; altrimenti restituisce l'operando corretto .

vostro esempio può essere riscritta come:

public NameValueCollection Metadata 
    { 
    get { 
      if (metadata == null) 
       metadata = new NameValueCollection(); 

      return metadata; 
     } 
    } 
0

Il ?? l'operatore è chiamato operatore a coalescenza nulla e viene utilizzato per definire un valore predefinito per tipi di valori nullable e tipi di riferimento. Restituisce l'operando di sinistra se non è nullo; altrimenti restituisce l'operando corretto.

http://msdn.microsoft.com/en-us/library/ms173224.aspx

2

Da MSDN: http://msdn.microsoft.com/en-us/library/ms173224.aspx

Un tipo nullable può contenere un valore, oppure può essere indefinito. Il ?? operatore definisce il valore predefinito da restituire quando un tipo nullable è assegnato a un tipo non nullable. Se si tenta di assegnare un tipo di valore nullable a un tipo di valore non nullable senza utilizzare il ?? operatore, genererai un errore in fase di compilazione. Se si utilizza un cast e il tipo di valore nullable non è definito al momento, verrà generata un'eccezione InvalidOperationException.

class NullCoalesce 
{ 
static int? GetNullableInt() 
{ 
    return null; 
} 

static string GetStringValue() 
{ 
    return null; 
} 

static void Main() 
{ 
    // ?? operator example. 
    int? x = null; 

    // y = x, unless x is null, in which case y = -1. 
    int y = x ?? -1; 

    // Assign i to return value of method, unless 
    // return value is null, in which case assign 
    // default value of int to i. 
    int i = GetNullableInt() ?? default(int); 

    string s = GetStringValue(); 
    // ?? also works with reference types. 
    // Display contents of s, unless s is null, 
    // in which case display "Unspecified". 
    Console.WriteLine(s ?? "Unspecified"); 
} 

}

+0

Se stai citando MSDN, ti preghiamo di fornire un link. – strager

1

Questo è utilizzato per sostituire valore predefinito nel caso di variabile NULL.

X = (if Y is not null return Y) ?? (else return DEFAULT) 

Leggi discussione dettagliato a How useful is C#'s ?? operator?