2009-03-27 8 views
4

Quand utilisez-vous des blocs de code en C/C++/C#, etc.? Je connais la raison théorique derrière eux, mais quand les utilisez-vous dans de vrais programmes?Quand utilisez-vous des blocs de code?

EDIT: Je viens de réaliser que je les utilise dans switch déclarations, où les variables seraient autrement dans la même portée (grr pour des choses comme i):

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

etc (Juste pour clarifier , dans une instruction switch, les accolades supplémentaires sont pas nécessaire)


connexes.

Répondre

1

Vous pouvez obtenir un finally comme le comportement en C++ en utilisant des blocs de code et des objets RAII.

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

dégagera le descripteur de fichier dans le destructor, peu importe ce qui nous amène à quitter le bloc.

(Personnellement, je suis encore en train de faire une pratique de cela. Mes racines c tiennent une poigne de fer sur mes habitudes ...)

+0

Vous pouvez également utiliser ceci: Créez un objet wrapper autour d'une primitive de synchronisation et placez-le sur une pile dans le bloc dont vous avez besoin. De cette façon, vous ne pouvez pas oublier de libérer le verrou. – mkb

0

En plus de l'évidence (« au besoin par la syntaxe »,
Chaque fois que vous devez traiter un bloc de 2 instructions ou plus comme une unité atomique

3

Je fais la même chose avec des blocs de commutation, même si ce n'est pas nécessaire. En général, j'utilise des blocs de code où ils rendent le code plus lisible (que ce soit en donnant à des blocs de code similaires une apparence similaire ou en obtenant simplement l'indentation) ou bien ils affectent correctement les variables.

10

J'ai parfois, mais rarement, utilisé des blocs de code nus pour limiter la portée. Par exemple, prenez le code suivant:

double bedroomTemperature = ReadTemperature(Room.Bedroom); 
database.Store(Room.Bedroom, bedroomTemperature); 

double bathroomTemperature = ReadTemperature(Room.Bathroom); 
database.Store(Room.Bedroom, bedroomTemperature); 

Le code semble bien à première vue, mais contient une subtile erreur pasta copie. Dans la base de données, nous avons stocké la température de la chambre pour les deux lectures. Si elle avait été écrit:

{ 
    double bedroomTemperature = ReadTemperature(Room.Bedroom); 
    database.Store(Room.Bedroom, bedroomTemperature); 
} 

{ 
    double bathroomTemperature = ReadTemperature(Room.Bathroom); 
    database.Store(Room.Bedroom, bedroomTemperature); 
} 

le compilateur (ou même IDE si elle est assez intelligent) aurait repéré cela.

Cependant, 90% du temps, le code peut être refactorisé pour rendre les blocs nus inutiles, par ex. le code ci-dessus serait mieux écrit en boucle ou deux appels à une méthode qui lit et enregistre la température:

foreach (Room room in [] { Room.Bedroom, Room.Bathroom }) 
{ 
    double temperature = ReadTemperature(room); 
    database.Store(room, temperature); 
} 

blocs nus sont utiles à l'occasion cependant.

Questions connexes