你什么时候使用代码块?

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

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

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

等等(只是为了澄清,在switch语句中,不需要额外的括号。)


有关:

  • 你是否使用花括号进行额外的范围设计? (https://stackoverflow.com/questions/249009/do-you-use-curly-braces-for-additional-scoping)

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

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

虽然裸体块有用。

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

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

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

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

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

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