你什么时候使用代码块?

时间:2009-03-27 17:27:42

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

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

编辑:我刚刚意识到我在switch语句中使用它们,否则变量将在同一范围内(对于像i这样的事情而言):< / p>

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

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


相关:

4 个答案:

答案 0 :(得分:10)

我有时,但很少使用裸代码块来限制范围。例如,请使用以下代码:

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);
}

虽然裸体块有时很有用。

答案 1 :(得分:3)

我使用开关块做同样的事情,即使它不是必需的。一般来说,我使用代码块,它们可以使代码更具可读性(无论是通过给出类似的代码块来获得类似的外观还是只是获得缩进),或者它们适当地限制变量。

答案 2 :(得分:1)

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

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

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

(就个人而言,我仍然试图对此进行练习。我的根源对我的习惯造成了死亡......)

答案 3 :(得分:0)

除了显而易见的(“语法需要时”,如在开关或最后尝试捕捉),
每当您需要将2个或更多语句的块视为原子单元时