C# 删除不必要的布尔文字、有害影响或后果?
C# Remove the unnecessary Boolean literal, Harmful effects or Consequences?
开发人员有时会在代码中使用以下语法,
if (isProductFlag == true)
if (customerExist == true)
..etc
Sonarqube 发出警告。
问题是上面的语法有负面影响,意思是影响 speed/performance,导致错误,大大增加编译时间,系统中的错误?有什么需要注意的,哪些可能对程序有害?如果没有造成伤害,请考虑关闭此特定的 Sonarqube 警告。
我们知道上面的语法是多余的,应该是if (isProductFlag)
或者if (customerExist)
。然而,每个程序员都有自己的风格。我们可以关注计划中的许多其他问题,包括截止日期等。
SonarQube: Remove the unnecessary Boolean literal(s).
资源:Is it bad to explicitly compare against boolean constants e.g. if (b == false) in Java?
更新:这如何处理可为空的布尔值?
这纯粹是风格,但表明您的代码不是很清楚:
if (productFlag == true)
是多余的,使用更好的变量名会更好:
if (hasProductFlag)
{
//...
}
如果以后需要,这也使重构更加清晰
if (hasProductFlag())
还是比
清楚
if (hasProductFlag() == true)
功能上有区别吗?几乎可以肯定不是。但它可以减少更清晰的错误。
编译后的代码可能很少会略有不同,这是可行的。但永远不应该因此而产生功能上的差异。
无论如何,Roslyn 编译器都会优化此类文字。它将修剪无法访问的代码,在可能的地方对编译时常量执行计算等。可以肯定地说对生成的代码没有影响,你可以用反编译器证明这一点 - IL 是相同的有或没有冗余常量.
SonarQube 出于两个原因向您发出警告。第一,此代码不必要地冗长。干净的代码实践提倡代码应该是可读的,最好接近实际的自然语言。哪个读起来更好?
if (customerExists)
{
DoWork();
}
if (customerExists == true)
{
DoWork();
}
"If customerExists, DoWork" 还是 "If customerExists equals true, DoWork"?哪一项更有可能作为客户要求出现在设计文档中?没有人说话像"If it rains equals true, I'll take an umbrella".
二,这样一行字很烦人。为什么开发人员明确声明 this 应该等于 true?还有其他我看不到的事情吗?我可能会将鼠标悬停在变量上以确保它甚至是布尔值。 如果某件事是不必要的,它会立即引发"why is that here?"的问题。你想避免你的开发人员问这样的问题。意图要明确。
我想我应该补充一点,后者可以说更糟糕。这就是 Andy Hunt 和 Dave Thomas 在他们出色的 "Pragmatic Programmer" 中所说的“a broken window”。这些小事会让开发人员觉得没有人真正关心代码。那东西有必要吗?该死的,如果我知道,很久以前有人写过它,最好保持原样。它从小事开始,并随着时间的推移而积累。乍一看可能有点迂腐,而且我当然不是要告诉你世界末日——让你认为你的整个项目会因为一些布尔文字而崩溃和燃烧。但是如果没有人关心代码的这一方面,他们为什么要关心下一个?
开发人员有时会在代码中使用以下语法,
if (isProductFlag == true)
if (customerExist == true)
..etc
Sonarqube 发出警告。
问题是上面的语法有负面影响,意思是影响 speed/performance,导致错误,大大增加编译时间,系统中的错误?有什么需要注意的,哪些可能对程序有害?如果没有造成伤害,请考虑关闭此特定的 Sonarqube 警告。
我们知道上面的语法是多余的,应该是if (isProductFlag)
或者if (customerExist)
。然而,每个程序员都有自己的风格。我们可以关注计划中的许多其他问题,包括截止日期等。
SonarQube: Remove the unnecessary Boolean literal(s).
资源:Is it bad to explicitly compare against boolean constants e.g. if (b == false) in Java?
更新:这如何处理可为空的布尔值?
这纯粹是风格,但表明您的代码不是很清楚:
if (productFlag == true)
是多余的,使用更好的变量名会更好:
if (hasProductFlag)
{
//...
}
如果以后需要,这也使重构更加清晰
if (hasProductFlag())
还是比
清楚if (hasProductFlag() == true)
功能上有区别吗?几乎可以肯定不是。但它可以减少更清晰的错误。
编译后的代码可能很少会略有不同,这是可行的。但永远不应该因此而产生功能上的差异。
无论如何,Roslyn 编译器都会优化此类文字。它将修剪无法访问的代码,在可能的地方对编译时常量执行计算等。可以肯定地说对生成的代码没有影响,你可以用反编译器证明这一点 - IL 是相同的有或没有冗余常量.
SonarQube 出于两个原因向您发出警告。第一,此代码不必要地冗长。干净的代码实践提倡代码应该是可读的,最好接近实际的自然语言。哪个读起来更好?
if (customerExists)
{
DoWork();
}
if (customerExists == true)
{
DoWork();
}
"If customerExists, DoWork" 还是 "If customerExists equals true, DoWork"?哪一项更有可能作为客户要求出现在设计文档中?没有人说话像"If it rains equals true, I'll take an umbrella".
二,这样一行字很烦人。为什么开发人员明确声明 this 应该等于 true?还有其他我看不到的事情吗?我可能会将鼠标悬停在变量上以确保它甚至是布尔值。 如果某件事是不必要的,它会立即引发"why is that here?"的问题。你想避免你的开发人员问这样的问题。意图要明确。
我想我应该补充一点,后者可以说更糟糕。这就是 Andy Hunt 和 Dave Thomas 在他们出色的 "Pragmatic Programmer" 中所说的“a broken window”。这些小事会让开发人员觉得没有人真正关心代码。那东西有必要吗?该死的,如果我知道,很久以前有人写过它,最好保持原样。它从小事开始,并随着时间的推移而积累。乍一看可能有点迂腐,而且我当然不是要告诉你世界末日——让你认为你的整个项目会因为一些布尔文字而崩溃和燃烧。但是如果没有人关心代码的这一方面,他们为什么要关心下一个?