稀に、裸のコードブロックを使用してスコープを制限することがあります。たとえば、次のコードを取る:
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);
}
裸のブロックは、しかし際に有用です。
これを使用することもできます:同期プリミティブの周囲にラッパーオブジェクトを作成し、保護が必要なブロックのスタックに配置します。この方法でロックを解除することを忘れることはできません。 – mkb