2010-12-03 11 views
1

私はいつもこの方法を使用する必要があります...ステートメントORファンクションを使用すると、リソースを破棄/削除できますか?

Public Function DoWork() 

    Using dc as New myDataContext() 

     ... 

    End Using 

End Function 

またはちょうど十分機能を終了し、同じことを行うのですか?エンドは、DataContextのリソースの処分の観点から使用して

Public Function DoWork() 

    Dim dc as New myDataContext() 

    ... 

End Function 

エンド機能は同じことを行う出ていますか?

+3

私は決して.NETでプログラミングされていませんが、そのトピックは週に3回出てくるので、私は答えを知っています。平均的な.NETプログラマーは、彼の言語についてこのことを少し知っていますか? – delnan

答えて

4

これはまったく異なっています。

オブジェクトにIDisposableが実装されている場合は、それを処分することを念頭に置く必要があります。usingブロックにラップするのが最も簡単な方法です。

(そしてオブジェクトは、その後IDisposableを実装していないあなたがそれを処分するか、あなたが望んだ場合でも、とにかくusingを使用できない場合。)

+0

関数内でUsingブロックを使用しているときにFor/Next Loopなどの中でExit関数を呼び出す必要がある場合、どのようにシナリオを処理しますか? – EdenMachine

+3

'using'ブロックがあなたのためにその状況を処理します。基本的に 'try ... finally'に変換されます。ここで' finally'ブロックはあなたのオブジェクトに対して 'Dispose'が呼び出されることを保証します。 – LukeH

+0

@EdenMachineなぜそれが問題になるのでしょうか?関数から戻ったり例外をスローした場合でも、 'using'ステートメントのスコープを離れると、オブジェクトは破棄されます。致命的な障害(OutOfMemory、...)の場合にのみ実行されます – CodesInChaos

4

using文の目的は、対象物の上にDisposeを呼び出すことですIDisposableを実装しています。それを手動で行う方法はtry...finallyのステートメントですが、それはもっと醜いです。

この機能を終了しても、Disposeは呼び出されません。ローカル変数は範囲外になり、オブジェクトをもう参照しません。オブジェクトがもはや参照を持たないということは、即座の反応を引き起こさない。これは、GC から今後収集する可能性があることを意味します。

GCがそれらを収集するまで、ネイティブリソースが残りますので、後で可能です。または、Disposeの中で削除されたオブジェクトへの他の参照がある場合、まったく収集されないこともあります。あなたはfinallyは何が起こるかに関係なくdisposeの呼び出しの面倒を見るように

{ 
    ResourceType resource = expression; 
    try { 
     statement; 
    } 
    finally { 
     if (resource != null) ((IDisposable)resource).Dispose(); 
    } 
} 

:参照型の

Using statement in the VB.net specification

そして、C#で(VB.netは非常に類似していなければならない)usingはに対応しますstatement。関数を終了したり、例外をスローしたりしても、最後に実行されます。
OutOfMemory、StackOverflow、強制的なapp-domain unloadのような致命的なエラーは、それを実行しません。

+0

これにより、メモリ不足または接続プールタイムアウトが発生する可能性があります。 – Steven

関連する問題