последовательность оператора ИЛИ - PullRequest
3 голосов
/ 30 января 2012

У меня есть следующий оператор OR, теперь в настоящее время, если c равно null, будет возвращено представление Error, и при второй проверке не будет возникать нулевое исключение (! C.ManagedBy ...);но это произойдет, только если компилятор выполнит проверку (c == null) перед проверкой (! c.Ismanaged ..).

Book c = elearningrepository.GetBook(id);

if ((c == null) || (!c.IsManagedBy(User.Identity.Name)))
{
    return View("Error");
}

, поэтому я могу гарантировать, что компилятор всегда будет выполнять команду c== сначала проверьте NULL, либо лучше разделить вышеуказанную проверку на два отдельных оператора If, чтобы явно реализовать последовательность.BR

Ответы [ 8 ]

5 голосов
/ 30 января 2012

|| делает короткое замыкание и оценивает точно так, как вы описали. Нет необходимости разделять утверждения.

С MSDN :

Оператор условного ИЛИ (||) выполняет логическое ИЛИ своего bool операнды. Если первый операнд имеет значение true, второй операнд не оценивается Если первый операнд имеет значение false, второй оператор определяет, будет ли выражение OR в целом вычисляться как правда или ложь.

Отредактировано для самой последней статьи MSDN (2010).

4 голосов
/ 30 января 2012

Да, вы можете полагаться на то, что левый операнд || будет оцениваться первым, и что правый операнд не будет оцениваться, если левый операнд оценивается как true.

Этогарантируется в разделе 7.12 спецификации C # 4:

  • Операция x || y соответствует операции x | y, за исключением того, что y оценивается, только если x не соответствует действительности.
2 голосов
/ 30 января 2012

, поэтому я могу гарантировать, что компилятор всегда будет выполнять c == null проверьте сначала

Да, это гарантировано, оператор || будет замыкать после первого условия, которое оценивается как true (порядок оценки слева направо).

1 голос
/ 30 января 2012

C # гарантирует, что это порядок выполнения слева направо. || в отличие от | имеет оценку короткого замыкания:

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

1 голос
/ 30 января 2012

Да.|| разрешается слева направо, это означает, что сначала будет оцениваться левый операнд, а затем правый.Он также замыкает накоротко, поэтому не стоит беспокоиться о том, что правый операнд вычисляется, когда левый операнд равен true.Наконец, он также имеет более низкий приоритет, чем == или !, так что вы даже можете убрать скобки, и он по-прежнему абсолютно безопасен и никогда не подведет вас:)

if (c == null || !c.IsManagedBy(User.Identity.Name))
{
    return View("Error");
}
1 голос
/ 30 января 2012

Да, оператор || гарантирует, что первый операнд вычисляется первым, а второй операнд оценивается только в том случае, если первый равен false.

1 голос
/ 30 января 2012

Компилятор всегда будет сначала вычислять левое выражение. Если он оценивается как true, правильный будет пропущен.

1 голос
/ 30 января 2012

Я бы выделил это только ради большей ясности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...