2010-09-22 2 views
8

Можно создать дубликат:
What do two question marks together mean in C#?Что такое '??' означает в C#?

Я пытаюсь понять, что делает даного: что делает "??" имею в виду? это этот тип som если if-statment?

string cookieKey = "SearchDisplayType" + key ?? ""; 
+4

Если можно было бы найти "??" на SO это будет квалифицироваться как дубликат, например. [Это] (http://stackoverflow.com/questions/770186/null-coalescing-operator-what-does-coalescing-mean). :-( –

+5

1. Начать C# 2. '??' 3. ПРИБЫЛЬ! – leppie

+0

следить за оператором по приоритету http://msdn.microsoft.com/en-us/library/6a71f45d.aspx – tom3k

ответ

14

Это Null Coalescing оператор. Это означает, что если первая часть имеет значение, то это значение возвращается, в противном случае возвращается вторая часть.

т.д .:

object foo = null; 
object rar = "Hello"; 

object something = foo ?? rar; 
something == "Hello"; // true 

Или некоторый фактический код:

IEnumerable<Customer> customers = GetCustomers(); 
IList<Customer> customerList = customers as IList<Customer> ?? 
    customers.ToList(); 

Этот пример делает бросает клиентов как IList<Customer>. Если этот результат приводит к нулевому значению, он вызовет метод LINQ ToList для клиента IEnumerable.

Сопоставимые, если заявление будет таким:

IEnumerable<Customer> customers = GetCustomers(); 
IList<Customer> customersList = customers as IList<Customer>; 
if (customersList == null) 
{ 
    customersList = customers.ToList(); 
} 

Который много кода по сравнению с делать это в одной строке с помощью оператора нуль-коалесцирующий.

+2

всего одно очко -> вы не можете делать 'var foo = null;' – nothrow

+0

@Yossarian - Да, хороший момент, но это был просто псевдокод. Я изменил его, чтобы избежать путаницы. – GenericTypeTea

+0

@Yossarian - вы можете сделать var var = (object) null; ' или 'var foo = (SomeClass) null;' который поможет ke Названия переменных ep выстроились и код легко читается. – Enigmativity

5

Это this. Ну не совсем.

Собственно, это this. И this, this, this и this, чтобы назвать несколько. Я использовал всемогущий Google, чтобы найти их, так как SO не имеет функции для поиска ответов (правильно?), Что затрудняет поиск дубликатов этого вопроса. Ну, в будущем, используйте это как ссылку. ;-)

Он называется оператором с нулевой связью. Это в основном то же самое, что и

int? nullableDemoInteger; 
// ... 
int someValue = nullableDemoInteger ?? -1; 
// basically same as 
int someValue = nullableDemoInteger.HasValue ? nullableDemoInteger.Value : -1; 
// basically same as 
int someValue; 
if(nullableDemoInteger.HasValue) 
    someValue = nullableDemoInteger.Value; 
else 
    someValue = -1; 
+0

+1 наилучшее использование символов типа Nable imo – abatishchev

1

Это Null Coalescing operator, который проверяет, имеет ли значение значение null и возвращает значение после ??, если оно есть.

1

Его нуль-коалесцирующий оператор.

Это означает, что если key не является нулевым, он использует значение ключа, если ключ имеет значение null, он использует значение "".

4

Это null-coalescing operator.В данном случае это примерно эквивалентно:

string cookieKey; 
string temp = "SearchDisplayType" + key; 
if (temp == null) 
    cookieKey = ""; 
else 
    cookieKey = temp; 

И, так как "SearchDisplayType" + key никогда не может быть null, это точно эквивалентно:

string cookieKey = "SearchDisplayType" + key; 
+0

+1. Побей меня. Отвечайте только так, что упоминает приоритет '??' vs '+' и что он избыточен в примере OP. – Ani

+0

Неправильно. Если (key == null) нет, если («SearchDisplayType» + ключ) == null). – Goran

+0

@Goran: Нет, LukeH правильный. Возможно, это не интуитивно, а проверять. – Ani

1

?? это null-coalescing.

Из MSDN:

В ?? оператор называется оператором нулевой коалесценции и используется для определения значения по умолчанию для типов нулевых значений , а также типов ссылок . Он возвращает левый операнд , если он не равен NULL; в противном случае он возвращает правый операнд .

Обратите внимание, однако, что в вашем случае левая часть выражения не может быть нулевой, beacuse это конкатенация строковой константы с переменной. Если ключ равен нулю, то ключ «SearchDisplayType» + оценивается как «SearchDisplayType».

Я предполагаю, что цель вашего заявления может быть реализована с:

string cookieKey = key==null ? "" : "SearchDisplayType"+key; 

с помощью этого кода, cookieKey установлен в пустую строку, если ключ является недействительным, в противном случае устанавливается в конкатенации «SearchDisplayType» + ключ

Смежные вопросы