如果做法不好,C#空白还能逃脱吗?

时间:2010-09-16 21:51:21

标签: c# indentation

我的意思是,如果我想要if语句有一个else,那么这是不好的做法,但是有一个嵌套的if语句“以我的方式”所以我使用了一个空白的else语句,例如“else;”还是“否则{}”逃脱它?

例如:

if (lsvAddons.SelectedItems.Count > 0)
    foreach (ListViewItem A in lsvAddons.SelectedItems)
        if (Addons[A.Index] != null) Addons[A.Index].DoHelp();
        else { }
else Console.WriteLine(_GenericHelpString);

VS

if (lsvAddons.SelectedItems.Count > 0)
{
    foreach (ListViewItem A in lsvAddons.SelectedItems)
        if (Addons[A.Index] != null) Addons[A.Index].DoHelp();
}
else Console.WriteLine(_GenericHelpString);

甚至:

if (lsvAddons.SelectedItems.Count > 0)
{
    foreach (ListViewItem A in lsvAddons.SelectedItems)
    {
        if (Addons[A.Index] != null) 
        { 
            Addons[A.Index].DoHelp();
        }
    }
}
else
{
    Console.WriteLine(_GenericHelpString)
}

9 个答案:

答案 0 :(得分:23)

大括号是你的朋友。

如果你抵制忽略大括号的冲动,你就会领先于曲线。第三种形式是完全明确的,更易于阅读,并将帮助您避免意外的错误。我不了解你,但我可以马上理解第三种形式的行为..前两种形式需要更多的思考和心理解析才能正确。

许多开发人员试图摆脱大括号并使用if语句的隐式形式。不幸的是,当你碰到这样的事情时你会怎么做:

if( someCondition... )
    DoSomething();
    DoAnotherThing();

开发人员是否只是缩进错误?或者是否意图让两种方法成为相同条件的一部分?事后很难说出来......并且是缺陷的主要来源。这是一个更糟糕的例子:

if( someCondition );
    DoSomething();
    DoAnotherThing();

你注意到这里的微妙错误吗?

如果你使你的代码毫不含糊,并且对这些问题不那么谨慎,那么从长远来看你会好得多。

开发人员经常争论省略大括号,以便他们的代码更短,更容易理解。现在,避免使用长方法肯定是有好处的(有些人甚至认为方法应该总是长一屏)......但我不认为这种简洁引入的风险通常值得奖励。请记住,有一些方法可以重新构建方法以避免过度嵌套 - 并且它们通常比在省略大括号时获得更多可读性。

我的个人口头禅是:

  1. 纠正错误。
  2. 说清楚。
  3. 简明扼要。
  4. 按顺序快速完成。

答案 1 :(得分:9)

空代码块是不好的做法。

else { }

答案 2 :(得分:7)

使用第三种格式。

if (lsvAddons.SelectedItems.Count > 0)
{
    foreach (ListViewItem A in lsvAddons.SelectedItems)
    {
        if (Addons[A.Index] != null) 
        { 
            Addons[A.Index].DoHelp();
        }
    }
}
else
{
    Console.WriteLine(_GenericHelpString)
}

答案 3 :(得分:7)

如果你问哪个更好,更干净的代码,那么最后一个!

我不知道为什么开发人员如此努力地将他们的代码压缩成越来越令人困惑的形式。额外的括号可能无法告诉编译器有什么不同,但这只是良好编码的一半。让它变得清晰,你的同事和软件用户会感谢你减少错误!

答案 4 :(得分:7)

空的else会让你的代码更具可读性吗?不,但是大括号呢。

答案 5 :(得分:4)

您的第二个版本是“最佳做法”。 ReSharper会抱怨空代码块,并且使用较少的关键字通常会更好。是的,版本2占用了更多的空白,但这不一定是坏事,并且它具有更少的非空白字符。

答案 6 :(得分:3)

过多的牙箍是不必要的,也很烦人。

我不介意大括号,我认为如果你有几个级别的嵌套,你应该使用它们,即使只有一个语句。 但你不应该一直虔诚地使用它们。

非常简单的事情,如

if (some_condition)
    Console.WriteLine("some info");

使用大括号将完全超过顶部,并且会更难以看到周围代码的更大图片(因为您可以在屏幕上放置更少的大小)。

答案 7 :(得分:2)

使用大括号({})指定if所属的else。默认情况下,它属于同一范围内最靠近它的if(大括号)。使用括号还可以提高您以及可能阅读它的其他开发人员的可读性。

所以,使用你的第二种格式来解决你的问题。

if (lsvAddons.SelectedItems.Count > 0)
{
    foreach (ListViewItem A in lsvAddons.SelectedItems)
        if (Addons[A.Index] != null) Addons[A.Index].DoHelp();
}
else Console.WriteLine(_GenericHelpString);

但是,为了便于阅读,我更倾向于您提供的第三个示例。

答案 8 :(得分:1)

在第一个例子中我花了一些时间来理解一切都属于什么,所以我说这是不好的做法。

我个人

  1. 永远不要嵌套无支撑控制结构,因为它很难阅读。
  2. ifelse上使用大括号,或两者都不使用大括号。
  3. 所以我将其格式化如下:

    if (lsvAddons.SelectedItems.Count > 0)
    {
        foreach (ListViewItem A in lsvAddons.SelectedItems)
        {
            if (Addons[A.Index] != null) 
                Addons[A.Index].DoHelp();
        }
    }
    else
    {
        Console.WriteLine(_GenericHelpString)
    }