混淆If Statement?

Net*_*ide 12 c# java if-statement

我总是使用If语句(在C#中)作为(1. Alternative);

if (IsSuccessed == true)
{
   //
}
Run Code Online (Sandbox Code Playgroud)

我知道没有必要写"== true"作为(2. Alternative));

if (IsSuccessed)
{
   //
}
Run Code Online (Sandbox Code Playgroud)

但是,我使用它是因为它更具可读性并且不会导致性能问题.当然,这是我的选择,我知道许多软件开发人员更喜欢第一种选择.什么是最佳用法,为什么?

Bri*_*sen 25

我不喜欢第一种选择.它不仅是多余的,而且一个简单的拼写错误会引入一个错误.

考虑一下

bool b = false;

if (b = true) {
   Console.WriteLine("true");
}
Run Code Online (Sandbox Code Playgroud)

显然,代码将输出"true",但这可能不是程序员的意图.

幸运的是,像Resharper这样的工具会对此发出警告,但它会使用默认设置(*)进行编译.

直接使用bool将完全消除问题.

(*)公平地说,VS也会对此发出警告,如果你将警告作为错误打开它甚至不会编译.

  • 好答案.虽然我同意其他基于风格的答案,但这提供了省略不必要比较的实际原因. (7认同)
  • 虽然这会编译,但你确实得到了一个警告,即使没有Resharper* - *"条件表达式中的赋值总是不变的;你的意思是使用==而不是=?" (4认同)
  • @Brian:你的回答意味着你需要使用像Resharper这样的工具来获得警告; 尼克只是指出事实并非如此.无论如何,我同意你的其余答案. (2认同)

Ant*_*lev 19

我个人会选择第二种选择.它更自然地读取并表明程序员实际上意识到内置bool类型,这是一流的公民.

  • 那么设计就是错误的.你应该避免天生的负面bool:使用isOkay而不是isFaulty,hasMembers而不是hasNoMembers,isInWorkMode而不是isInFaultMode等.避免像fire一样的双重和更深的底片:绕过`if(!noInitErrors)`.围绕`if(!isInFaultMode)`作为标准检查设计系统的一个错误已经在我的屁股上多次咬过我了. (8认同)

小智 8

完全依赖于风格.认真.随心所欲地为你自己的东西,无论你工作的风格如何.


Kon*_*lph 7

我声称赞成第一种选择的人粗略地掌握了布尔逻辑.他们可能在理智上"理解"它,但他们肯定不会理解它; 他们没有内化这种思维方式.

毕竟,是否有人都使用以下成语?"如果明天下雨是假的,我们可能会去游泳" - ,当然不是.没有人说这样的话,这太荒谬了.什么论证支持这种说法,即当应用于编程(而不是自然)语言时,这个成语突然变得清晰?


Jen*_*ens 6

我更喜欢第二种选择.我认为它更具可读性,但是如果Boolean?因某些原因需要使用,第一种替代方案具有保持相同的优点.

  • 不,我在尝试时遇到编译器错误."不能隐式转换类型'bool?' 'bool'......" (2认同)

Rob*_*Rob 4

如果布尔值的名称完全清楚它是什么,那么我总是选择版本 2。但是,有时您会遇到一个特别迟钝的变量名称,您无法更改它,至少可以'现在不要改变...重构一切都很好,但在对代码进行功能更改时我也会尝试避免过度重构。

例如:

if (!NoDropDownInHeader == true)
{
  // Activates when there *is* a dropdown in the header)
}
Run Code Online (Sandbox Code Playgroud)

我实际上已经在生产代码中看到了这个特定的示例,并将其简化为:

if (NoDropDownInHeader == false)
{
 // Activates when there *is* a dropdown in the header
}
Run Code Online (Sandbox Code Playgroud)

我个人认为这两个示例都比以下示例更具可读性(尽管可以说第一个示例可能与这个示例在心理解析上的难度相当):

if (!NoDropDownInHeader)
{
 // Activates when there *is* a dropdown in the header
}
Run Code Online (Sandbox Code Playgroud)

注意: 是的,我知道该变量的命名很糟糕,但是在它存在的多个地方更改它超出了我所做的更改的范围,因为 if 会影响.

  • 同意 - 我总是喜欢“积极”的变量,即在这种情况下放弃“否”。使它更容易阅读。双重否定可不是什么好事! (5认同)