2012-04-03 20 views
6

私は範囲管理のためにusingステートメントを純粋に使用したいと思います。 IDisposableを実装する基本オブジェクトへの明示的な参照を保持することを省略することはできますか?RHV(右辺値)でusingステートメントを使用できますか?

class ITransactionScope : IDisposable {} 
class TransactionGuard : ITransactionScope {...} 

class DbContext 
{ 
    public IDisposable ITransactionScope() 
    { 
     return new TransactionGuard(); 
    } 
} 

は、私は、次の操作を行うことができます:

void main() 
{ 
    var dbContext = new DbContext(); 

    using (dbContext.TransactionScope()) 
    { 
     // the guard is not accessed here 
    } 
} 

using文の中に生きているTransactionGuardインスタンスですか?これはdeclaraions与え例えば

+0

あなたはそれを試すことができます。返されたスコープインスタンスの 'Dispose()'メソッドにブレークポイントを設定し、それが呼び出されるかどうかを確認します。 – linuxuser27

+0

私は同じ戦略を使用しているので、あなたができることを本当に願っています:) –

+3

あなたが気にするのはスコープ管理だから、コードに中括弧を入れることはできません( 'using'なしで)。コード内のスコープは? –

答えて

10

私はusingステートメントをスコープ管理専用に使用します。

あなたはそれがために設計されているもののためusingステートメントを使用する必要があります。タイムリーに管理されていないリソースを配置します。それがusingを使用しているのでなければ、おそらく何か間違っているでしょう。

IDisposableを実装する基本オブジェクトへの明示的な参照を保持しないでください。

もう1つの回答が指摘したとおり、既にコードを入力しています。あなたは単にそれを試してみることができました。

はい、できます。コンパイラはあなたのために目に見えないローカル変数を作成し、Disposeを呼び出します。

あなたがC#4仕様のセクション8.13を読んusingの使用についてさらに質問がある場合、私はことをお勧めします。

+0

あなたは私の答えを見ていただけますか? GCはそれを再利用しませんか? – Aliostad

+0

@Aliostad:C#の仕様では、 'using(expr)s;'は 'X temp = expr;と全く同じです。 {s; } finally {if(temp!= null)((IDisposable)temp).Dispose();} '。ガベージコレクタが 'Dispose'を呼び出す前にtemp *をクリーンアップするという主張はありますか? –

+0

@Ericおそらく、C#の機能の悪用についてMVCチームと話すことができます。 ;)私はこの1つを気にしない。それは便利な構文であり、リフレクションを使用しません。 –

2

処分するまでは生きています。あ、はい。

そして、質問のこのタイプは、そんなに簡単にあなただけコンパイルして実行]ボタンをhitingで答えるのです。あなたはすでにコードを入力しました。それを試してみてください。

+1

-1。これは必ずしも真実ではありません。あなたは試してみることがありますが、それは100回働きますが、前回はありません – Aliostad

+5

@Aliostad:私はあなたに従っていない。批判は完全に正当だと思われる。その質問は簡単にそれを試すことで、あるいはそれ以上に簡単に答えることができました。 using文が100回連続して動作して失敗するプログラムの例を教えてください。 –

+0

@EricLippert私の主張は、GCが '文 'を使う前にそれを取り戻すかもしれないということでした。したがって、私の答えは、あなたがそれを見直すことができれば、感謝するでしょう。 – Aliostad

関連する問題