4

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

EDIT :switch変数が同じスコープ内にあるステートメントでそれらを使用していることに気付きました( grr のようなものi):

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

など (明確にするために、switch ステートメントでは、余分な中括弧は必要ありません。)


関連している:

4

4 に答える 4

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

ただし、裸のブロックが役立つ場合もあります。

于 2009-03-27T17:59:35.317 に答える
3

必須ではありませんが、スイッチ ブロックでも同じことを行います。一般に、コードを読みやすくする (似たようなコード ブロックを似たような外観にするか、単にインデントするかによる) か、変数のスコープを適切にするために、コード ブロックを使用します。

于 2009-03-27T17:32:22.217 に答える
1

finallyコード ブロックと RAII オブジェクトを使用すると、C++ で同様の動作を得ることができます。

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

ブロックを離れる原因に関係なく、デストラクタでファイル記述子を解放します。

(個人的には、私はまだこれを実践しようとしています。私の c ルーツは、私の習慣に死のグリップを保持しています...)

于 2009-03-27T17:31:03.983 に答える
0

明白なこと (switch や try catch finally などの「構文で必要な場合」) に加えて、
2 つ以上のステートメントのブロックを原子単位として扱う必要があるときはいつでも

于 2009-03-27T17:31:07.210 に答える