【问题标题】:When do you use code blocks?什么时候使用代码块?
【发布时间】:2010-10-15 23:57:14
【问题描述】:

您什么时候在 C/C++/C# 等中使用代码块?我知道它们背后的理论原因,但你什么时候在实际程序中使用它们?

编辑:我刚刚意识到我在switch 语句中使用它们,否则变量将在同一范围内(对于i 之类的东西,grr):

switch (x) { case "abc": { /* code */ } break; }

等 (澄清一下,在 switch 语句中,额外的大括号 NOT 是必需的。)


相关:

【问题讨论】:

    标签: c# .net coding-style codeblocks curly-braces


    【解决方案1】:

    我有时但很少使用裸代码块来限制范围。比如下面的代码:

    double bedroomTemperature = ReadTemperature(Room.Bedroom);
    database.Store(Room.Bedroom, bedroomTemperature);
    
    double bathroomTemperature = ReadTemperature(Room.Bathroom);
    database.Store(Room.Bedroom, bedroomTemperature);
    

    代码乍一看很好,但包含一个微妙的复制粘贴错误。在数据库中,我们存储了两个读数的卧室温度。如果它被写成:

    {
        double bedroomTemperature = ReadTemperature(Room.Bedroom);
        database.Store(Room.Bedroom, bedroomTemperature);
    }
    
    {
        double bathroomTemperature = ReadTemperature(Room.Bathroom);
        database.Store(Room.Bedroom, bedroomTemperature);
    }
    

    那么编译器(如果它足够智能,甚至是 IDE)都会发现这一点。

    但是,在 90% 的情况下,可以重构代码以使裸块变得不必要,例如上面的代码最好写成一个循环或两次调用读取和存储温度的方法:

    foreach (Room room in [] { Room.Bedroom, Room.Bathroom })
    {
        double temperature = ReadTemperature(room);
        database.Store(room, temperature);
    }
    

    不过,裸块有时也很有用。

    【讨论】:

      【解决方案2】:

      您可以通过使用代码块和 RAII 对象在 C++ 中获得类似 finally 的行为。

      {
         std::fstream f(filename)
         ...
      }
      

      无论是什么导致我们离开块,都会在析构函数中释放文件描述符。

      (就我个人而言,我仍在努力实践这一点。我的 c 根牢牢地抓住了我的习惯......)

      【讨论】:

      • 您也可以使用以下方法:围绕同步原语创建一个包装器对象,并将其放在您需要保护的块中的堆栈中。这样你就不会忘记释放锁。
      【解决方案3】:

      我对开关块做同样的事情,即使它不是必需的。一般来说,我使用代码块,它们要么使代码更具可读性(无论是通过为相似的代码块提供相似的外观还是仅仅获得缩进),或者它们正确地作用域变量。

      【讨论】:

        【解决方案4】:

        除了显而易见的(“当语法需要时”,例如在 switch 或 try catch finally 中)之外,
        每当您需要将包含 2 个或更多语句的块视为一个原子单元时

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-03-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-04
          相关资源
          最近更新 更多