2010-09-28 17 views
13

Eventuali duplicati:
What do two question marks together mean in C#?Cosa fa ?? operatore significa in C#?

Ciao, ero alla ricerca di alcuni corsi di formazione di MVC 2 in C# e ho trovato questo sintassi:

ViewData["something"] = something ?? true; 

Quindi, qual è quella '??' si intende ?.

+7

Domanda duplicata di http://stackoverflow.com/questions/446835/what-do-two-question-marks-together-mean-in-c? – Crag

+1

Siamo spiacenti, l'ho cercato e non sono riuscito a trovarlo, quindi l'ho pubblicato. Grazie mille a tutti voi ragazzi! Adoro questa pagina, c'è una risposta per tutto: D – pjnovas

risposta

22

È il null-coalescing operator.

Restituisce il primo argomento a meno che non sia null, nel qual caso restituisce il secondo.

x ?? y è approssimativamente equivalente a questo (tranne che il primo argomento viene valutata una sola volta):

if (x == null) 
{ 
    result = y; 
} 
else 
{ 
    result = x; 
} 

alternativa:

(x == null) ? y : x 

è utile per fornire un valore predefinito, in caso di valore può essere nullo:

Color color = user.FavouriteColor ?? defaultColor; 

COALESCE

Quando utilizzato in un LINQ to SQL interrogare l'operatore ?? può essere tradotto in una chiamata a COALESCE. Ad esempio questa query LINQ:

var query = dataContext.Table1.Select(x => x.Col1 ?? "default"); 

può risultare in questa query SQL:

SELECT COALESCE([t0].[col1],@p0) AS [value] 
FROM [dbo].[table1] AS [t0] 
+0

In qualche modo strana, 'object x = null ?? null; 'è un'istruzione valida. Immagino che non ti aspetti che il compilatore faccia anche da babysitter! – RedFilter

+0

ReSharper ti avviserà di una possibile NullReferenceException se fai riferimento a un membro di x dopo questa dichiarazione, ma sì, verrà compilato. – KeithS

+0

Eeeek !!! questo è un bel punto hehe – pjnovas

5

E è l'operatore nullo coalescenza. Il valore restituito è il lato sinistro se non è nullo e il lato destro altrimenti. Funziona per entrambi i tipi di riferimento e nullables

var x = "foo" ?? "bar"; // "foo" wins 
string y = null; 
var z = y ?? "bar"; // "bar" wins 
int? n = null; 
var t = n ?? 5; // 5 wins 
3

Se qualcosa è nullo, restituisce vero, altrimenti restituisce qualcosa. Vedere this link per ulteriori informazioni.