Когда вы используете блоки кода? - PullRequest
4 голосов
/ 27 марта 2009

Когда вы используете блоки кода в C / C ++ / C # и т. Д.? Я знаю их теоретическую причину, но когда вы используете их в реальных программах?

РЕДАКТИРОВАТЬ : Я только что понял, что использую их в switch выражениях, где в противном случае переменные были бы в той же области видимости (grr для таких вещей, как i):

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

и т.д. (Просто для пояснения, в инструкции switch дополнительные скобки НЕ обязательны.)


Связанный:

Ответы [ 4 ]

10 голосов
/ 27 марта 2009

Я иногда, но редко, использую блоки открытого кода для ограничения области видимости. Например, возьмите следующий код:

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

Голые блоки полезны иногда.

3 голосов
/ 27 марта 2009

Я делаю то же самое с блоками переключателей, хотя это и не требуется. В общем, я использую блоки кода, где они либо делают код более читабельным (будь то путем придания одинаковым блокам кода похожего вида или просто получая отступы), либо они правильно определяют области видимости переменных.

1 голос
/ 27 марта 2009

Вы можете получить поведение finally в C ++, используя блоки кода и объекты RAII.

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

освободит файловый дескриптор в деструкторе независимо от того, что заставляет нас покинуть блок.

(Лично я все еще пытаюсь практиковать это. Мои корни держат смерть в своих привычках ...)

0 голосов
/ 27 марта 2009

В дополнение к очевидному («когда требуется синтаксис», как в случае с переключателем или попыткой перехвата наконец),
Всякий раз, когда вам нужно обработать блок из 2 или более операторов в качестве атомной единицы

...