当前位置:  开发笔记 > 编程语言 > 正文

有关C#短路评估的最佳实践是什么?

如何解决《有关C#短路评估的最佳实践是什么?》经验,为你挑选了2个好方法。

另一个帖子中的评论中的答案和随后的辩论促使我问:

在C#||中 和&&是逻辑运算符的短路版本 和&分别.

用法示例:

if (String.IsNullOrEmpty(text1) | String.IsNullOrEmpty(text2) | String.IsNullOrEmpty(text3))
{
    //...
}

与:

if (String.IsNullOrEmpty(text1) || String.IsNullOrEmpty(text2) || String.IsNullOrEmpty(text3))
{
    //...
}

在编码实践方面哪个更好用,为什么?

注:我不知道这个问题是相似的这个问题,但我相信它值得特定语言的讨论.



1> Konrad Rudol..:

在编码实践方面哪个更好用,为什么?

简单回答:始终使用短路版本.根本没有理由不这样做.此外,您可以使代码更清晰,因为您表达了您的意图:逻辑评估.使用按位(逻辑)操作意味着您只需要:位操作,而不是逻辑评估(即使MSDN在应用于布尔值时也称它们为"逻辑运算符").

此外,由于短路仅评估需要评估的内容,因此通常更快,并且允许编写此类代码

bool nullorempty = str == null || str.Length == 0;

(请注意,为了解决这个特殊问题,已经存在一个更好的函数,即string.IsNullOrEmpty您在问题中也使用过的函数.)使用按位逻辑运算无法使用此代码,因为即使strnull,第二个表达式也会被评估,从而导致a NullReferenceException.

编辑:如果你在逻辑上下文中发生副作用,请仍然不要使用按位运算.这是一个太聪明的典型例子.代码的下一个维护者(或者甚至是你自己,几个星期后)看到这个代码会认为"嗯,这个代码可以被清除以使用条件运算符",从而无意中破坏了代码.我很遗憾谁负责修复这个bug.

相反,如果你必须依赖副作用,请将它们明确化:

bool hasBuzzed = checkMakeBuzz();
bool isFrobbed = checkMakeFrob();
bool result = hasBuzzed || isFrobbed;

当然,三行而不是一行.但结果是更清晰的代码.


完美答案.+1副作用讨论 - 同意,维护,始终是明确的.3个LOC与维护噩梦,3个LOC获胜.
此外,即使你不认为SC评估是要走的路,无论如何都要这样做,因为人们已经用这种方式编写了C/C++ 30年.现在几乎是普通法.

2> tsimon..:

我将反过来回答这个问题:我是唯一一次使用逻辑运算符?

当我有一系列必须满足的(低成本)条件时,我有时会使用逻辑比较.例如:

bool isPasswordValid = true;

isPasswordValid &= isEightCharacters(password);
isPasswordValid &= containsNumeric(password);
isPasswordValid &= containsBothUppercaseAndLowercase(password);

return isPasswordValid;

在我看来,上述内容比以下内容更具可读性:

return (isEightCharacters(password) &&
        containsNumberic(password)  &&
        containsBothUppercaseAndLowercase(password));

缺点是它有点深奥.


在您的示例中,如果密码为7个字符,则无效.因此,它是否包含数字和/或大写/小写是无关紧要的,并且不会改变任何内容.确实应该采用短路.如果单个return语句的可读性是个问题,你可以将代码更改为三行:`if(!RequirementCheck(input))return false;`那么最后一行应该只是说`return true;`.但是,如果你想要每个req.检查以返回特定消息,然后组合消息,然后此示例不再适用于此问题,我们有更多的不相关性.
推荐阅读
跟我搞对象吧
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有