什么时候在C/C++/C#等中使用代码块?我知道它们背后的理论原因,但你什么时候在实际程序中使用它们?
编辑:我刚刚意识到我在switch
语句中使用它们,否则变量将在相同的范围内(对于类似的东西i
):
switch (x) { case "abc": { /* code */ } break; }
等等(只是为了澄清,在switch语句中,额外的括号不是必需的.)
有关:
你是否使用花括号进行额外的范围设计?(/sf/ask/17360801/)
Paul Ruane.. 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); }
虽然裸体块有用.
我有时,但很少使用裸代码块来限制范围.例如,请使用以下代码:
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); }
虽然裸体块有用.