2009-03-27 11 views
4

いつC/C++/C#などでコードブロックを使用しますか?私はそれらの背後にある理論的な理由を知っていますが、実際のプログラムでいつそれらを使用していますか?いつコードブロックを使用しますか?

EDIT:私はちょうど私は、変数がそうでなければ(iのようなもののためにGRR)と同じ範囲にあるであろうswitch文、でそれらを使用することを実現しています

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

など (ジャスト明確にします、switch文では、余分な括弧は必要ありませんある)関連


答えて

1

あなたは、コードブロックとRAIIオブジェクトを使用してC++での行動のようなfinallyを得ることができます。

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

は関係なくブロックを残すために、私たちの原因をデストラクタでファイルディスクリプタを解放しません。

(個人的に、私はまだこれの練習をしようとしています。私のCの根は私の習慣上の死グリップを保持...)

+0

これを使用することもできます:同期プリミティブの周囲にラッパーオブジェクトを作成し、保護が必要なブロックのスタックに配置します。この方法でロックを解除することを忘れることはできません。 – mkb

0

を明らかにすることに加えて(「構文で必要とされるとき」、
、最終的にはスイッチまたはトライキャッチ)のように、あなたがアトミック単位として2つの以上の文のブロックを処理する必要があるとき

3

私はそれが必要とされていなくても、スイッチブロックで同じことを行います。一般的に、私はコードブロックを使用して、コードの読みやすさを向上させています(同様のコードブロックに類似した外観を与えたり、インデントを取得したりするなど)。

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%。上記のコードは、より良いループまたは温度を読み取り、格納する方法には2つの呼び出しのように記述されるであろう:

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

裸のブロックは、しかし際に有用です。

関連する問題