另一个帖子中的评论中的答案和随后的辩论促使我问:
在C#||中 和&&是逻辑运算符的短路版本 和&分别.
用法示例:
if (String.IsNullOrEmpty(text1) | String.IsNullOrEmpty(text2) | String.IsNullOrEmpty(text3)) { //... }
与:
if (String.IsNullOrEmpty(text1) || String.IsNullOrEmpty(text2) || String.IsNullOrEmpty(text3)) { //... }
在编码实践方面哪个更好用,为什么?
注:我不知道这个问题是相似的这个问题,但我相信它值得特定语言的讨论.
在编码实践方面哪个更好用,为什么?
简单回答:始终使用短路版本.根本没有理由不这样做.此外,您可以使代码更清晰,因为您表达了您的意图:逻辑评估.使用按位(逻辑)操作意味着您只需要:位操作,而不是逻辑评估(即使MSDN在应用于布尔值时也称它们为"逻辑运算符").
此外,由于短路仅评估需要评估的内容,因此通常更快,并且允许编写此类代码
bool nullorempty = str == null || str.Length == 0;
(请注意,为了解决这个特殊问题,已经存在一个更好的函数,即string.IsNullOrEmpty
您在问题中也使用过的函数.)使用按位逻辑运算无法使用此代码,因为即使str
是null
,第二个表达式也会被评估,从而导致a NullReferenceException
.
编辑:如果你想在逻辑上下文中发生副作用,请仍然不要使用按位运算.这是一个太聪明的典型例子.代码的下一个维护者(或者甚至是你自己,几个星期后)看到这个代码会认为"嗯,这个代码可以被清除以使用条件运算符",从而无意中破坏了代码.我很遗憾谁负责修复这个bug.
相反,如果你必须依赖副作用,请将它们明确化:
bool hasBuzzed = checkMakeBuzz(); bool isFrobbed = checkMakeFrob(); bool result = hasBuzzed || isFrobbed;
当然,三行而不是一行.但结果是更清晰的代码.
我将反过来回答这个问题:我是唯一一次使用逻辑运算符?
当我有一系列必须满足的(低成本)条件时,我有时会使用逻辑比较.例如:
bool isPasswordValid = true; isPasswordValid &= isEightCharacters(password); isPasswordValid &= containsNumeric(password); isPasswordValid &= containsBothUppercaseAndLowercase(password); return isPasswordValid;
在我看来,上述内容比以下内容更具可读性:
return (isEightCharacters(password) && containsNumberic(password) && containsBothUppercaseAndLowercase(password));
缺点是它有点深奥.