Делает С#?? короткое замыкание оператора?
При использовании оператора ??
в С# выполняется ли короткое замыкание, если тестируемое значение не является нулевым?
Пример:
string test = null;
string test2 = test ?? "Default";
string test3 = test2 ?? test.ToLower();
Ли строка test3 претерпевает успешное выполнение или выбрасывает исключение ссылочной ссылки?
Итак, еще один способ сформулировать вопрос: будет ли правильное выражение? оператор получает оценку, если левая рука не равна нулю?
Ответы
Ответ 1
Да, он говорит об этом в Спецификации языка С# (выделение мной):
Нулевое коалесцирующее выражение формы a ?? b
требует, чтобы a
имел тип NULL или ссылочный тип. Если a
не является нулевым, результатом a ?? b
является a
; в противном случае результат b
. Операция оценивает b
только в том случае, если a
имеет значение null.
Ответ 2
Да, это короткие замыкания.
class Program
{
public static void Main()
{
string s = null;
string s2 = "Hi";
Console.WriteLine(s2 ?? s.ToString());
}
}
Вышеупомянутая программа выводит "Привет", а не бросает NullReferenceException
.
Ответ 3
Да.
public Form1()
{
string string1 = "test" ?? test();
MessageBox.Show(string1);
}
private string test()
{
MessageBox.Show("does not short circuit");
return "test";
}
Если это не короткое замыкание, будет вызван test(), и окно сообщения покажет, что оно "не замыкается".