ответ

14

Вы на самом деле относитесь к функции языка под названием «закорачивание логических выражений»:

Что это означает: когда результат логического выражения не может измениться больше, например, когда ясно, что выражение будет оцениваться как «истинное» или «ложное», независимо от того, оставшиеся части выражения не будут оцениваться.

Например, C#, Java или JavaScript делают это, и вы можете положиться на него на этих языках (чтобы ответить на ваш вопрос).

В вашем случае, если MyClass не равно нулю:

  • MyClass == null оценивает ложные
  • , так как это «или» выражение, то вторая часть все еще может изменить результат, поэтому оценивается
  • myClass.Property > 0 определяет конечный результат

, если МойКласс равно нулю:

  • MyClass == null оценивает истинный
  • , так как это «или» выражение, это не имеет значения, что следует
  • не более оценка будет сделана, конечный результат верен

Есть языки, которые делают а не коротких замыканий логических выражений. Классический VB является примером, здесь «myClass.Property> 0» будет оцениваться и выдавать ошибку, если MyClass был нулевым (так называемый «Nothing» в VB).

0

Порядок оценки зависит от оператора, в этом случае логическое значение или (||) определяется как обычно называемое short-circuiting, для создания таких конструкций, как эта работа.

5

Короткое замыкание описано в разделе 7.11 спецификации C# 3.0:

операция х || y соответствует операция x | y, за исключением того, что y = оценивается только в том случае, если x не является истинным.

Так что да, с вами все в порядке.

Что касается других языков - не люблю говорить все языков. В VB.NET вы можете использовать OrElse и AndAlso, которые закорочены, но простые Or и And не являются.

2

Но будьте осторожны:

если у вас есть что-то вроде

Sprintf (Buf, "% S% s", func1 (& вара), func2 (& вара));

с побочными эффектами на var, он не определен (в C, я не уверен, что порядок оценки определен на других языках), в каком порядке выполняются функции func1() и func2() (это зависит, в чем порядок (слева или справа) аргументы помещаются в стек и оценивается оттуда.

+0

В C# определяется точный порядок. – Martijn 2008-12-03 11:10:27

0

Я не уверен, вы действительно заинтересованы в заказе или в оценке короткого замыкания?

Я не 100 %, но насколько я знаю, порядок оценки всегда будет одинаковым в C# (и я предполагаю, что большинство, если не все языки .net). Работа по короткому замыканию работает, как объяснялось в предыдущих ответах.

Однако в C# вы можете отказаться от короткого замыкания с использованием простых операторов (& вместо & &). Обычно вы хотите выполнить короткое замыкание, но это может быть случай, когда вы хотите выполнить все оценки.

0

Операторы на таких языках, как Ada, Visual Basic и Pascal, не имеют короткого замыкания. Они предоставляют дополнительные операторы для обеспечения такой функциональности, как «а затем» и «или еще» в Ada.

0

Python имеет короткое замыкание or и and операторов.

0

В Java и Haskell & & и || короткое замыкание.

Интересно, что в Haskell это происходит естественно с помощью языка (вы можете определить свои собственные операторы, которые это делают), в то время как в Java и C# это специфический для этих двух операторов.

0

На самом деле короткое замыкание - это часть, но вам также необходимо знать, гарантирует ли язык левую-правую оценку. Например, C (ANSI, ISO, C99) НЕ гарантируют оценку слева направо. В образце кода можно было бы проверить значение свойства перед проверкой NULL или сделать оба одновременно ... большинство компиляторов этого не делают, но нет ничего, что помешало бы ему сделать это и полностью соответствовать спецификации. Это даже говорит вам НЕ писать такой код из-за этого.

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