私は以下のようなコードを持っています。クラスレベル変数でusingステートメントを使用することは悪い習慣ですか?
class MyController
{
[ThreadStatic] private DbInterface db;
public void ImportAllData()
{
using (db = new DbInterface())
{
var records = PullData();
PushData(records);
}
}
private DbRecord[] PullData()
{
return db.GetFromTableA();
}
private void PushData(DbRecord[] records)
{
db.InsertIntoTableB(records);
}
}
代替方法は、維持するのがずっと面倒です。
class MyController
{
public void ImportAllData()
{
using (var db = new DbInterface())
{
var records = PullData(db);
PushData(records, db);
}
}
private DbRecord[] PullData(DbInterface db)
{
return db.GetFromTableA();
}
private void PushData(DbRecord[] records, DbInterface db)
{
db.InsertIntoTableB(records);
}
}
私の知る限り見ることができるように、私の最初の実装:
- は(
DbInterface
は、スレッドセーフであると仮定した場合)スレッドセーフで、 - は
db
変数に触れるから他のプロセスを防ぎ、かつ db
は、例外時にも常に廃棄されます。
using
ステートメントをクラススコープの変数に使用することは悪い習慣ですか?私は何かを逃したか?
拡張子を使用していると見なされますか?あるいはこれをたくさんすることを計画していますか? –
興味深いことに、Winフォームのペイントコードを実行した場合、OnPaintおよびPaintイベントは、少なくともrefをuseブロックの外に渡すことに関して、これと非常によく似ています。あなたに割り当てられたグラフィカルコンテキストが渡され、その管理/廃棄が呼び出し元によって処理されるため、実際の描画メソッドで自分自身を処理しません。 – tcarvin
@DanSaltmer、私は他のコントローラで 'DbInterface'クラスの使用を予定しています。私はコントローラがすべての 'DbInterface'メソッドにアクセスできるようにしたいと思いますが、私はコントローラがそれぞれのプライベートメソッドについて知ることは望ましくありません。私の理解では、拡張メソッドはすべての 'DbInterface'インスタンスに適用されます。それとも私はあなたを誤解したことがありますか? –