C# 如果第一个条件为false,那么假设if和语句总是中断是否安全?
如果我有C# 如果第一个条件为false,那么假设if和语句总是中断是否安全?,c#,conditional-statements,C#,Conditional Statements,如果我有 if (false && true) ... 我能确定每台计算机/编译器/任何东西都会执行忽略第二个条件的快捷方式吗?在我的实现中,第二个条件假设第一个条件为true,否则将导致致命错误。例如: if (Foobar is BoolContainer && Foobar.BoolVar) ... 其中,BoolContainer是一个具有布尔属性的示例类BoolVar是,它是安全的。 如果希望对双方都进行评估,可以使用&而不是&&。
if (false && true)
...
我能确定每台计算机/编译器/任何东西都会执行忽略第二个条件的快捷方式吗?在我的实现中,第二个条件假设第一个条件为true,否则将导致致命错误。例如:
if (Foobar is BoolContainer && Foobar.BoolVar)
...
其中,BoolContainer
是一个具有布尔属性的示例类BoolVar
是,它是安全的。
如果希望对双方都进行评估,可以使用&而不是&&。
否则,在这种情况下,它将跳过第二个条件。根据条件逻辑ANN运算符的文档,使用
&&
运算符的条件仅在所有条件计算为true时计算为true
如果任何条件的计算结果为false,则整个计算结果为false
从左到右计算条件时,如果上一个条件的计算结果为false,则不计算下一个条件。MSDN states():
条件逻辑与运算符&&,也称为“短路”逻辑与运算符,用于计算其操作数的逻辑与。如果x和y的计算结果均为true,则x&&y的结果为true。否则,结果为假。如果x的计算结果为false,则不计算y
所以你的假设是正确的。尽管在使用&时要小心:
&运算符计算其操作数的逻辑AND。如果x和y的计算结果均为真,则x&y的结果为真。否则,结果为假
即使左侧操作数的计算结果为false,&运算符也会计算这两个操作数,因此无论右侧操作数的值如何,运算结果都为false
当您使用&.时,您可能会得到不必要的评估。&有一种情况,&
不一定会做您期望的事情。在正常代码中,您不会遇到这种情况。;)
在下面的代码中,两个布尔值都将输出为True
,但是如果您&
它们,结果将(在.NET的某些版本上,但不是所有版本上)不是True
(因为true2
是一个“不寻常的”True
)
同样,这不是你在现实生活中会经历的事情
namespace MyNamespace
{
using System;
using System.Runtime.InteropServices;
namespace Work
{
[StructLayout(LayoutKind.Explicit)]
public struct HackedBoolean
{
[FieldOffset(0)] public int value;
[FieldOffset(0)] public bool boolean;
public bool GetBool(int seed)
{
value = seed;
return boolean;
}
}
public class MyClassCS
{
public static void Main(string[] args)
{
var hacked = new HackedBoolean();
var true1 = hacked.GetBool(1);
var true2 = hacked.GetBool(2);
Console.WriteLine(true1);
Console.WriteLine(true2);
Console.WriteLine(true1 && true2);
Console.WriteLine(true1 == true2);
Console.ReadLine();
}
}
}
}
是的
操作x&&y
与操作x&y
相对应,除非y
仅在x
不是false
时才进行评估
根据我的经验,短路条件表达式的第二部分依赖于这种行为是一种非常常见的习惯用法
您可能想知道为什么它会说“not
false
”而不是“true”。对于bool
类型,这两者是等效的。起初我认为这是因为bool?
有一个提升的操作符来处理null
,但是。但是,您可以对重载true
、false
、&
和|
运算符的类型执行类似的操作,事实上,规范提供了这样做的功能。我建议重新措辞,使“Yes.”不是答案。即,要求从标准中获得解释或引用。&&
要求这两个条件都为真,以便执行if
块中的代码。因此,是的,如果第一个条件不是真的,那么它将不会检查第二个条件,并计算为假,并跳过执行if
块。@ChetanRanpariya请在回答文章中而不是在注释中回答。您可能会感兴趣,特别是,即使我编写的代码将针对不同的操作系统进行编译,这始终是一个安全的假设(只要我小心地使用&&
而不是&
)。@JustinIaconis C#规范要求&&operator短路。任何在左侧为false时计算右侧的C#编译器都有一个bug。C#编译器产生IL,因此对于特定平台的即时编译器,应该没有办法撤消短路评估。我认为这个建议可能与.net fw版本有关-如果您&&
在472上的结果为真,而在.net coreGreat point@CaiusJard上的结果为假-已更新。