混淆If Statement?

时间:2010-03-09 08:43:33

标签: c# java if-statement

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

if (IsSuccessed == true)
{
   //
}

我知道没有必要将“== true”写成(2. Alternative));

if (IsSuccessed)
{
   //
}

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

13 个答案:

答案 0 :(得分:25)

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

考虑一下

bool b = false;

if (b = true) {
   Console.WriteLine("true");
}

显然代码会输出“true”,但这可能不是程序员的意图。

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

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

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

答案 1 :(得分:19)

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

答案 2 :(得分:8)

完全依赖于风格。认真。无论你喜欢什么,都可以选择适合你自己的东西,无论你工作中有什么样的风格。

答案 3 :(得分:7)

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

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

答案 4 :(得分:6)

我更喜欢第二种选择。我认为它更具可读性,但如果您出于某种原因需要使用Boolean?,那么第一种选择具有保持相同的优势。

答案 5 :(得分:4)

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

例如:

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

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

if (NoDropDownInHeader == false)
{
 // Activates when there *is* a dropdown in the header
}

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

if (!NoDropDownInHeader)
{
 // Activates when there *is* a dropdown in the header
}

注意: 是的,我知道这个变量命名很差,但是在它存在的众多地方更改它是因为我所做的更改范围之外如果会影响的地方数量。

答案 6 :(得分:3)

我曾经写过“== true”,因为我认为它更清晰,更明确,但决定改变。现在它似乎总是更清晰,你只会习惯它。

答案 7 :(得分:2)

我会满足于你的第二个选择。在我看来,没有必要写

if (IsSuccessed == true) 
{ 
   // 
} 

事实上,我完全不喜欢使用== true作为布尔值,因为它没有额外的值。 AND:你必须键入较少的字符,这显然是一个优点:p。 老实说,我也会将布尔值重写为bSuccessed,因为它是一个布尔值。

答案 8 :(得分:2)

这两个表达式在C#中是等效的,但要注意它们不是在其他语言中。

例如,在C ++中,第一个选项仅接受 一个值为true的布尔值。 IsSuccessed上的任何其他值都会使条件无效。

第二个选项接受“truthy”的任何值:像1这样的值或任何非零值也被认为对if有效。

所以这些条件将验证:

// Truthy validation (second option)
if(1) {...} //validates
if(2) {...} //validates

虽然其他人不会:

// Equals to true validation (first option)
if(1==true) {...} // does not validate
if(2==true) {...} // does not validate

同样,这不适用于C#,因为它只接受ifs上的布尔值。但请记住,其他语言接受的不仅仅是那里的布尔值。

答案 9 :(得分:2)

更多输入意味着更多的机会出现错误。选项2一路......

答案 10 :(得分:1)

当我开始编程时,我使用第一个,但有点习惯第二个选项。它还节省了额外字母的时间类型。

答案 11 :(得分:1)

我会选择第二个。至少对我来说这更容易。在第一种选择中,我总是想知道为什么要进行比较。检查左侧的类型,以确保没有开发人员在酸超载==运算符,在他的类和bool选项之间进行比较。
第一个也导致错误,第二个不会 if(a)可能需要更改为if(a||b)if(a&&b),其中if(a == true || b)if(a == true && b)可能最终为b,而if(a==b)位于前{{1}}是多余的,后者等于{{1}}

答案 12 :(得分:1)

我最看到的是:(我做的)

if (IsSuccessed)
{
   //
}

作为C ++的替代选择,对于C#,不需要(见注释):

if (true == IsSuccessed)
{
   //
}

另一种方法是防止自己错误地分配而不是比较。 (= vs ==)