С # ??оператор короткого замыкания? - PullRequest
28 голосов
/ 16 марта 2011

При использовании оператора ?? в C # происходит ли короткое замыкание, если проверяемое значение не равно нулю?

Пример:

string test = null;
string test2 = test ?? "Default";

string test3 = test2 ?? test.ToLower();

Успешна ли строка test3 или выданаисключение нулевой ссылки?

Итак, еще один способ сформулировать вопрос: будет ли выражение правой части ??Оператор получает оценку, если левая рука не равна нулю?

Ответы [ 3 ]

47 голосов
/ 16 марта 2011

Да, это так в спецификации языка C # (выделено мной):

Нулевое объединяющее выражение формы a ?? b требует, чтобы aобнуляемого типа или ссылочного типа.Если a не равно нулю, результат a ?? b равен a;в противном случае результат равен b. Операция оценивает b, только если a равно нулю.

16 голосов
/ 16 марта 2011

Да, это короткие замыкания.

class Program
{
    public static void Main()
    {
        string s = null;
        string s2 = "Hi";
        Console.WriteLine(s2 ?? s.ToString());
    }
}

Приведенная выше программа выводит «Привет», а не выбрасывает NullReferenceException.

7 голосов
/ 16 марта 2011

Да.

    public Form1()
    {
        string string1 = "test" ?? test();
        MessageBox.Show(string1);
    }

    private string test()
    {
        MessageBox.Show("does not short circuit");
        return "test";
    }

Если бы не было короткого замыкания, то было бы вызвано test (), и в окне сообщения было бы показано, что оно "не закорачивается".

...