В C# гарантировано, что выражения оцениваются слева направо?Оценка влево и вправо Оценка:
Например:
myClass = GetClass();
if (myClass == null || myClass.Property > 0)
continue;
Есть ли языки, которые не соответствуют?
В C# гарантировано, что выражения оцениваются слева направо?Оценка влево и вправо Оценка:
Например:
myClass = GetClass();
if (myClass == null || myClass.Property > 0)
continue;
Есть ли языки, которые не соответствуют?
Вы на самом деле относитесь к функции языка под названием «закорачивание логических выражений»:
Что это означает: когда результат логического выражения не может измениться больше, например, когда ясно, что выражение будет оцениваться как «истинное» или «ложное», независимо от того, оставшиеся части выражения не будут оцениваться.
Например, C#, Java или JavaScript делают это, и вы можете положиться на него на этих языках (чтобы ответить на ваш вопрос).
В вашем случае, если MyClass не равно нулю:
MyClass == null
оценивает ложныеmyClass.Property > 0
определяет конечный результат, если МойКласс равно нулю:
MyClass == null
оценивает истинныйЕсть языки, которые делают а не коротких замыканий логических выражений. Классический VB является примером, здесь «myClass.Property> 0» будет оцениваться и выдавать ошибку, если MyClass был нулевым (так называемый «Nothing» в VB).
Порядок оценки зависит от оператора, в этом случае логическое значение или (||
) определяется как обычно называемое short-circuiting, для создания таких конструкций, как эта работа.
Короткое замыкание описано в разделе 7.11 спецификации C# 3.0:
операция х || y соответствует операция x | y, за исключением того, что y = оценивается только в том случае, если x не является истинным.
Так что да, с вами все в порядке.
Что касается других языков - не люблю говорить все языков. В VB.NET вы можете использовать OrElse и AndAlso, которые закорочены, но простые Or и And не являются.
Но будьте осторожны:
если у вас есть что-то вроде
Sprintf (Buf, "% S% s", func1 (& вара), func2 (& вара));
с побочными эффектами на var, он не определен (в C, я не уверен, что порядок оценки определен на других языках), в каком порядке выполняются функции func1() и func2() (это зависит, в чем порядок (слева или справа) аргументы помещаются в стек и оценивается оттуда.
Я не уверен, вы действительно заинтересованы в заказе или в оценке короткого замыкания?
Я не 100 %, но насколько я знаю, порядок оценки всегда будет одинаковым в C# (и я предполагаю, что большинство, если не все языки .net). Работа по короткому замыканию работает, как объяснялось в предыдущих ответах.
Однако в C# вы можете отказаться от короткого замыкания с использованием простых операторов (& вместо & &). Обычно вы хотите выполнить короткое замыкание, но это может быть случай, когда вы хотите выполнить все оценки.
Операторы на таких языках, как Ada, Visual Basic и Pascal, не имеют короткого замыкания. Они предоставляют дополнительные операторы для обеспечения такой функциональности, как «а затем» и «или еще» в Ada.
Python имеет короткое замыкание or
и and
операторов.
В Java и Haskell & & и || короткое замыкание.
Интересно, что в Haskell это происходит естественно с помощью языка (вы можете определить свои собственные операторы, которые это делают), в то время как в Java и C# это специфический для этих двух операторов.
На самом деле короткое замыкание - это часть, но вам также необходимо знать, гарантирует ли язык левую-правую оценку. Например, C (ANSI, ISO, C99) НЕ гарантируют оценку слева направо. В образце кода можно было бы проверить значение свойства перед проверкой NULL или сделать оба одновременно ... большинство компиляторов этого не делают, но нет ничего, что помешало бы ему сделать это и полностью соответствовать спецификации. Это даже говорит вам НЕ писать такой код из-за этого.
В C# определяется точный порядок. – Martijn 2008-12-03 11:10:27