C# 常规OR(|)和常规and(&;)运算符是否有实际用途

C# 常规OR(|)和常规and(&;)运算符是否有实际用途,c#,operators,C#,Operators,我在“csharp station.com”上查找一些初级课程,复习我的C#知识。对于AND和OR运算符,我总是像其他人一样使用“&&”和“| |”。我甚至不知道有一个单一的版本 声明如下: 关于或:“两个OR形式之间的主要区别在于,正则OR运算符每次都会计算两个子表达式。但是,条件OR仅当第一个子表达式的计算结果为false时才会计算第二个子表达式。” About AND:“两者之间的区别在于,正则AND运算符每次都会对这两个表达式求值。但是,条件AND运算符仅在第一个子表达式求值为true时

我在“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,但适用于这里)它们很漂亮