C# 常规OR(|)和常规and(&;)运算符是否有实际用途
我在“csharp station.com”上查找一些初级课程,复习我的C#知识。对于AND和OR运算符,我总是像其他人一样使用“&&”和“| |”。我甚至不知道有一个单一的版本 声明如下: 关于或:“两个OR形式之间的主要区别在于,正则OR运算符每次都会计算两个子表达式。但是,条件OR仅当第一个子表达式的计算结果为false时才会计算第二个子表达式。” About AND:“两者之间的区别在于,正则AND运算符每次都会对这两个表达式求值。但是,条件AND运算符仅在第一个子表达式求值为true时才会对第二个子表达式求值。” 它的结论是:“条件运算符(&&和| |)通常被称为短路运算符,因为它们并不总是计算整个表达式。因此,它们还可以通过忽略不必要的逻辑来生成更高效的代码。”C# 常规OR(|)和常规and(&;)运算符是否有实际用途,c#,operators,C#,Operators,我在“csharp station.com”上查找一些初级课程,复习我的C#知识。对于AND和OR运算符,我总是像其他人一样使用“&&”和“| |”。我甚至不知道有一个单一的版本 声明如下: 关于或:“两个OR形式之间的主要区别在于,正则OR运算符每次都会计算两个子表达式。但是,条件OR仅当第一个子表达式的计算结果为false时才会计算第二个子表达式。” About AND:“两者之间的区别在于,正则AND运算符每次都会对这两个表达式求值。但是,条件AND运算符仅在第一个子表达式求值为true时
就这些?是否存在使用常规运算符更合理的单个代码示例?我知道这个问题很琐碎,但我只是好奇。提前谢谢。正如您所说,这些操作员不会短路。但这还不是全部:它们用于位操作。一些例子: 设置第4位:
// 00000010 | 00001000 == 00001010
value = value | (1 << 3);
// ~00001000 == 11110111
// 00001010 & 11110111 == 00000010
value = value & ~(1 << 3);
例如,您可以使用以下代码测试文件是否隐藏:
if ((attributes & FileAttributes.Hidden) != 0)
...
正如你所说,这些操作员不会短路。但这还不是全部:它们用于位操作。一些例子: 设置第4位:
// 00000010 | 00001000 == 00001010
value = value | (1 << 3);
// ~00001000 == 11110111
// 00001010 & 11110111 == 00000010
value = value & ~(1 << 3);
例如,您可以使用以下代码测试文件是否隐藏:
if ((attributes & FileAttributes.Hidden) != 0)
...
主要区别在于表达式是否有副作用,以及您是否希望这些副作用始终发生
public bool A()
{
Console.WriteLine("A");
return true;
}
public bool B()
{
Console.WriteLine("B");
return false;
}
使用上述方法,可执行以下操作:
if(A() || B())
Console.WriteLine("A or B");
还有这个
if(A() | B())
Console.WriteLine("A or B");
将打印出不同的结果
也就是说,依靠这些副作用是个坏主意。因此,一般而言,非短路逻辑运算符的使用仅适用于被视为设计不良的情况。因此,当您发现需要使用它们时,很可能意味着代码设计中存在缺陷
但正如其他人提到的,
&
和|
运算符也用于按位“and”和“OR”,这与将它们用于bool
表达式不同。主要区别在于表达式是否有副作用,以及您是否希望这些副作用总是发生
public bool A()
{
Console.WriteLine("A");
return true;
}
public bool B()
{
Console.WriteLine("B");
return false;
}
使用上述方法,可执行以下操作:
if(A() || B())
Console.WriteLine("A or B");
还有这个
if(A() | B())
Console.WriteLine("A or B");
将打印出不同的结果
也就是说,依靠这些副作用是个坏主意。因此,一般而言,非短路逻辑运算符的使用仅适用于被视为设计不良的情况。因此,当您发现需要使用它们时,很可能意味着代码设计中存在缺陷
但正如其他人提到的,&
和|
运算符也用于按位“and”和“OR”,这与将它们用于bool
表达式不同。它们执行二进制(基数2)计算。看
这些是所有计算机使用的基本机器操作。
计算机喜欢它们,但大多数程序员更喜欢十进制算术和枚举。它们执行二进制(基数2)计算。看 这些是所有计算机使用的基本机器操作。
计算机喜欢它们,但大多数程序员更喜欢十进制算术和枚举。这些运算符有一些假设的情况。如前所述,所有这些都有副作用 想象一下,您有一个带有
用户名
,密码
,确认
字段的web注册表
您应该在发布后验证用户的输入。您计划使用简单的验证方法,返回bool
、f.e.isusernameavable
、isusernamefalid
、IsPasswordComplexEnough
、以及ArePasswordAndConfirmationEquals
。所有这些方法都有一个包含错误消息的输入/输出参数IList
那么您的整个验证方法可能如下所示:
private bool ValidateAll(IList<string> errorMessages)
{
return IsUsernameAvailable(errorMessages)
| IsUsernameValid(errorMessages)
| IsPasswordComplexEnough(errorMessages)
| ArePasswordAndConfirmationEquals(errorMessages);
}
private bool ValidateAll(IList错误消息)
{
返回IsUsernameAvailable(错误消息)
|IsUsernameValid(错误消息)
|IsPasswordComplexEnough(错误消息)
|ArePasswordAndConfirmationEquals(错误消息);
}
对于这些运营商,有一些假设的场景。如前所述,所有这些都有副作用
想象一下,您有一个带有用户名
,密码
,确认
字段的web注册表
您应该在发布后验证用户的输入。您计划使用简单的验证方法,返回bool
、f.e.isusernameavable
、isusernamefalid
、IsPasswordComplexEnough
、以及ArePasswordAndConfirmationEquals
。所有这些方法都有一个包含错误消息的输入/输出参数IList
那么您的整个验证方法可能如下所示:
private bool ValidateAll(IList<string> errorMessages)
{
return IsUsernameAvailable(errorMessages)
| IsUsernameValid(errorMessages)
| IsPasswordComplexEnough(errorMessages)
| ArePasswordAndConfirmationEquals(errorMessages);
}
private bool ValidateAll(IList错误消息)
{
返回IsUsernameAvailable(错误消息)
|IsUsernameValid(错误消息)
|IsPasswordComplexEnough(错误消息)
|ArePasswordAndConfirmationEquals(错误消息);
}
您是否在问为什么要在逻辑、非短路的上下文中使用&
/|
?如果是这样的话,请看(它的Java,但在这里适用)它们在整数上非常有用,在整数上它们充当位运算符。我一直在密码中使用它们。你是在问为什么要在逻辑的、非短路的上下文中使用&
/|
?如果是这样的话,请看(它的Java,但适用于这里)它们很漂亮