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

标签 c#

一个答案和后续debate in the comments在另一个线程中提示我问:

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

示例用法:

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

对比:

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

就编码实践而言,哪个更好用,为什么?

注意:我确实意识到这个问题类似于 this question但我相信它值得针对特定语言进行讨论。

最佳答案

In terms of coding practice which is the better to use and why?

简单的答案:始终使用短路版本。根本没有理由不这样做。此外,您还可以让您的代码更清晰,因为您表达了您的意图:逻辑评估。使用按位(逻辑)运算意味着您只需要:位运算,而不是逻辑求值(尽管 MSDN 在应用于 bool 值时也称它们为“逻辑运算符”)。

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

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

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

编辑:如果您希望在逻辑上下文中出现副作用,请仍然不要使用按位运算。这是太聪明的典型例子。代码的下一位维护者(甚至是你自己,几周后)看到这段代码时不会想“嗯,这段代码可以清理一下以使用条件运算符”,从而无意中破坏代码。我很同情负责修复这个错误的人。

相反,如果您必须依赖副作用,请将它们显式化:

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

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

关于c# - 关于 C# 短路评估的最佳实践是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/361069/

相关文章:

c# - NEST 的方法 IndexMany 同步运行

c# - 如何从一个纹理显示大量 Sprite 并使它们以间隔XNA 4.0移动

C# 异步套接字 - 线程逻辑

c# - 尝试使用 linq 创建分组记录

c# - 是否有可能在 .NET (C#) 中以编程方式从头开始创建 *.config 文件?

c# - 大集合和 OrderBy 的 OutOfMemoryException?

c# - 在 DataGridView 中将 AutoSizeMode 设置为 AllCells 时出现 NullReferenceException

c# - 继承时 Json 的奇怪行为

c# - 我可以用派生类型覆盖吗?

c# - Entity Framework 6.1 Code First 迁移错误 : EntityType 'IdentityUserRole' has no key defined