何时在C / C ++ / C#等中使用代码块?我知道它们背后的理论原因,但你什么时候在实际程序中使用它们?
编辑:我刚刚意识到我在switch
语句中使用它们,否则变量将在同一范围内(对于像i
这样的事情而言):< / p>
switch (x) { case "abc": { /* code */ } break; }
等 (只是为了澄清,在一个switch语句中,额外的大括号是 NOT 是必需的。)
相关:
答案 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个或更多语句的块视为原子单元时