代码之家  ›  专栏  ›  技术社区  ›  Blam

C#如果不好的做法,还有什么可以逃避的吗?

  •  2
  • Blam  · 技术社区  · 14 年前

    我的意思是,如果我希望if语句有一个else语句,但是有一个嵌套的if语句“以我的方式”所以我使用一个空白的else语句,比如“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);
    

    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 回复  |  直到 14 年前
        1
  •  23
  •   LBushkin    14 年前

    牙套是你的朋友。

    如果你克制住省略大括号的冲动,你就会走在前面。第三种形式是完全明确的,更容易阅读,并将帮助您避免无意中的错误。我不知道你的情况,但我能马上理解第三种形式的行为。。前两种形式需要更多的思考和心理分析才能正确。

    if 声明。不幸的是,当你遇到这样的事情时你会怎么做:

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

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

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

    开发人员经常争论省略大括号,这样他们的代码就更短,更容易理解。现在,避免长方法肯定有好处(有些人甚至认为方法应该总是一屏长的)。。。但我认为这种简洁所带来的风险通常不值得回报。请记住,有一些方法可以重新构造方法以避免过度嵌套,而且它们通常比省略大括号获得更多的可读性。

    1. 说清楚。
    2. 要简洁。
    3. 快点。。。按这个顺序。
        2
  •  9
  •   Larsenal    14 年前

    空代码块是不好的做法。

    else { }
    
        3
  •  7
  •   JDT    14 年前

        4
  •  7
  •   Rohrbs    11 年前

    使用第三种格式。

    if (lsvAddons.SelectedItems.Count > 0)
    {
        foreach (ListViewItem A in lsvAddons.SelectedItems)
        {
            if (Addons[A.Index] != null) 
            { 
                Addons[A.Index].DoHelp();
            }
        }
    }
    else
    {
        Console.WriteLine(_GenericHelpString)
    }
    
        5
  •  7
  •   Fiona - myaccessible.website    11 年前

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

    我不知道为什么开发人员如此努力地将他们的代码浓缩成越来越令人费解的形式。额外的方括号可能不会告诉编译器任何不同之处,但这仅仅是好代码之争的一半。让它清晰易读,你的同事和软件用户会感谢你减少了错误!

        6
  •  4
  •   KeithS    14 年前

    你的第二个版本是“最佳实践”。ReSharper会抱怨代码块是空的,通常使用更少的关键字比使用更多的关键字更好。是的,版本2占用了更多的空白,但这不一定是坏事,而且它的非空白字符更少。

        7
  •  3
  •   Timwi    14 年前

    但你不应该一直虔诚地使用它们。

    对于一些非常简单的事情,比如

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

        8
  •  2
  •   Daniel A.A. Pelsmaeker    14 年前

    使用花括号( { } )要指定 if 你的 else 属于。默认情况下,它属于 如果 在同一范围内最接近它(花括号)。使用方括号还可以提高将来您和其他可能阅读它的开发人员的可读性。

    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
  •  1
  •   Matti Virkkunen    14 年前

    我个人认为

    1. 永远不要嵌套无支撑的控制结构,因为它可能很难读取。
    2. if else ,或者两者都不是。

    所以我把它格式化如下:

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