为什么省略大括号被认为是一种不好的做法?[已关闭]

2022-08-31 06:37:25

为什么每个人都告诉我写这样的代码是一种不好的做法?

if (foo)
    Bar();

//or

for(int i = 0 i < count; i++)
    Bar(i);

我省略大括号的最大论点是,它有时可能是它们的两倍行。例如,下面是一些用于在 C# 中为标签绘制发光效果的代码。

using (Brush br = new SolidBrush(Color.FromArgb(15, GlowColor)))
{
    for (int x = 0; x <= GlowAmount; x++)
    {
        for (int y = 0; y <= GlowAmount; y++)
        {
            g.DrawString(Text, this.Font, br, new Point(IconOffset + x, y));
        }
     }
 }
 //versus
using (Brush br = new SolidBrush(Color.FromArgb(15, GlowColor)))
    for (int x = 0; x <= GlowAmount; x++)
        for (int y = 0; y <= GlowAmount; y++)
            g.DrawString(Text, this.Font, br, new Point(IconOffset + x, y));

您还可以获得链接在一起的额外好处,而无需缩进一百万次。usings

using (Graphics g = Graphics.FromImage(bmp))
{
    using (Brush brush = new SolidBrush(backgroundColor))
    {
        using (Pen pen = new Pen(Color.FromArgb(penColor)))
        {
            //do lots of work
        }
    }
 }
//versus
using (Graphics g = Graphics.FromImage(bmp))
using (Brush brush = new SolidBrush(backgroundColor))
using (Pen pen = new Pen(Color.FromArgb(penColor)))
{
    //do lots of work
}

大括号最常见的参数围绕着维护编程,以及在原始if语句与其预期结果之间插入代码所带来的问题:

if (foo)
    Bar();
    Biz();

问题:

  1. 想要使用该语言提供的更紧凑的语法是错误的吗?设计这些语言的人很聪明,我无法想象他们会放一个总是不好用的功能。
  2. 我们是否应该或不应该编写代码,以便最低的公分母可以理解并且没有问题使用它?
  3. 我错过了另一个论点吗?

答案 1

实际上,唯一一次真正咬我的时候是当我调试时,并注释掉了bar():

if(foo)
  // bar();
doSomethingElse();

除此之外,我倾向于使用:

if(foo) bar();

这照顾了上述情况。

编辑感谢您澄清这个问题,我同意,我们不应该将代码编写到最低的公分母。


答案 2

读取速度...

除了已经提到的。在这一点上,我已经习惯于解析带有大括号和空格的if语句。所以我读到:

if (condition)
{
    DoSomething();
}

DoSomethingElse();

比我读的要快一点:

if (condition) DoSomething();

DoSomethingElse();

如果它看起来像这样,我读得慢一点:

if (condition) DoSomething();
DoSomethingElse();

我读这个比以前慢得多:

if (condition) 
    DoSomething();
DoSomethingElse();

我忍不住又读了一遍,以防万一,想知道作者是否有意:

if (condition)
{
    DoSomething();
    DoSomethingElse();
}

已经涵盖了一般内容,但是当涉及到阅读以下内容时,我将研究很长一段时间,以确保作者的意图。我甚至可能追捕原作者进行确认。

if (condition) 
    DoSomething();
    DoSomethingElse();