新しい

オブジェクトの破棄

オブジェクトの破棄


We are searching data for your request:

Forums and discussions:
Manuals and reference books:
Data from registers:
Wait the end of the search in all databases.
Upon completion, a link will appear to access the found materials.

記事「オブジェクトの新しいインスタンスのコーディング」で、さまざまな方法について書きました 新しい オブジェクトのインスタンスを作成できます。オブジェクトを破棄する反対の問題は、VB.NETで頻繁に心配する必要がないことです。NETには、 ガベージコレクター (GC)通常、背後ですべてを静かに効率的に処理します。ただし、通常、ファイルストリーム、SQLオブジェクト、またはグラフィックス(GDI +)オブジェクト(つまり、 管理されていないリソース)、独自のコードでオブジェクトを破棄する制御が必要になる場合があります。

まず、いくつかの背景

ちょうど 詐欺structor( 新しい キーワード)新しいオブジェクトを作成します、 structorは、オブジェクトが破棄されるときに呼び出されるメソッドです。しかし、キャッチがあります。 .NETを作成した人々は、2つの異なるコードが実際にオブジェクトを破壊できる場合、それがバグの公式であることに気付きました。そのため、.NET GCは実際に制御されており、通常はオブジェクトのインスタンスを破壊できる唯一のコードです。 GCは、以前ではなく決定したときにオブジェクトを破棄します。通常、オブジェクトがスコープを出ると、 解放された 共通言語ランタイム(CLR)によって。 GC 破壊する CLRがより多くの空きメモリを必要とするときにオブジェクト。要するに、GCが実際にオブジェクトを破壊する時期を予測できないということです。

(Wellllll…それは本当です ほぼ いつも。あなたは電話することができます GC.Collect ガベージコレクションサイクルを強制しますが、当局は普遍的にそれが 悪い アイデアとまったく不要。)

たとえば、コードが作成した場合 顧客 オブジェクト、このコードは再びそれを破壊するように見えるかもしれません。

顧客=何もない

しかし、そうではありません。 (オブジェクトをNothingに設定することは一般的に呼ばれ、 参照解除 実際には、変数がオブジェクトに関連付けられなくなったことを意味します。しばらくすると、GCはオブジェクトを破棄できることに気付きます。

ところで、管理対象オブジェクトの場合、これは実際には必要ありません。 ButtonのようなオブジェクトはDisposeメソッドを提供しますが、それを使用する必要はなく、ほとんどの人は行いません。たとえば、Windows Formsコンポーネントは、という名前のコンテナオブジェクトに追加されます。 部品。フォームを閉じると、そのDisposeメソッドが自動的に呼び出されます。通常、アンマネージオブジェクトを使用している場合でも、プログラムを最適化する場合にのみ、このことについて心配する必要があります。

オブジェクトによって保持されている可能性のあるリソースを解放する推奨方法は、 廃棄する オブジェクトのメソッド(使用可能な場合)、およびオブジェクトの逆参照。

Customer.Dispose()Customer = Nothing

オブジェクト変数をNothingに設定するかどうかに関係なく、GCは孤立したオブジェクトを破棄するため、実際には必要ありません。

不要になったオブジェクトを確実に破棄する別の推奨方法は、オブジェクトを使用するコードを を使用して ブロック。 Usingブロックは、コードがそれらで終了したときに、1つ以上のそのようなリソースの廃棄を保証します。

GDI +シリーズでは、 を使用して ブロックは、これらの厄介なグラフィックスオブジェクトを管理するために非常に頻繁に使用されます。例えば…

LinearBradientBrushとしてのmyBrushの使用_ =新しいLinearGradientBrush(_ Me.ClientRectangle、_ Color.Blue、Color.Red、_ LinearGradientMode.Horizo​​ntal)

myBrush ブロックの終わりが実行されると、自動的に破棄されます。

メモリを管理するGCのアプローチは、VB6が行っていた方法とは大きく異なります。 COMオブジェクト(VB6で使用)は、参照の内部カウンターがゼロに達したときに破壊されました。しかし、間違えるのは簡単すぎたため、内部カウンターはオフになりました。 (これが発生するとメモリが拘束され、他のオブジェクトが利用できないため、これは「メモリリーク」と呼ばれました。)代わりに、GCは実際に何かを参照しているオブジェクトがあるかどうかを確認し、参照がなくなったときにそれを破棄します。 GCアプローチは、Javaのような言語で長い歴史があり、.NETの大きな改善点の1つです。

次のページでは、IDisposableインターフェースを検討します。アンマネージオブジェクトを独自のコードに破棄する必要がある場合に使用するインターフェースです。

アンマネージリソースを使用する独自のオブジェクトをコーディングする場合は、 IDisposable オブジェクトのインターフェース。マイクロソフトは、適切なパターンを作成するコードスニペットを含めることで、これを簡単にします。

--------
ここをクリックしてイラストを表示してください
ブラウザの戻るボタンをクリックして戻ります
--------

追加されるコードは次のようになります(VB.NET 2008):

クラスResourceClass Implements IDisposable '冗長な呼び出しを検出するためにPrivate End If '独自の状態(アンマネージオブジェクト)を解放します。 '大きなフィールドをnullに設定します。 End If Me.disposed = True End Sub #Region "IDisposable Support" 'Visual Basicによって追加されたこのコードは、使い捨てパターンを正しく実装します。 Public Sub Dispose()Implements IDisposable.Dispose 'このコードを変更しないでください。 '上記のDispose(ByVal disposing As Boolean)にクリーンアップコードを配置します。 Dispose(True)GC.SuppressFinalize(Me)End Sub Protected Overrides Sub Finalize() 'このコードを変更しないでください。 '上記のDispose(ByVal disposing As Boolean)にクリーンアップコードを配置します。 Dispose(False)MyBase.Finalize()End Sub #End Region End Class

廃棄する .NETのほぼ「強制」開発者デザインパターンです。実際に正しい方法は1つしかなく、これがそれです。このコードは何か魔法のように思えるかもしれません。そうではありません。

まず、内部フラグ 処分した 単にすべてを短絡させるので、電話をかけることができます 処分(処分) 好きなだけ頻繁に。

コード…

GC.SuppressFinalize(Me)

…オブジェクトがすでに破棄されていることをGCに伝えることにより、コードをより効率的にします(実行サイクルの観点から「高価な」操作)。オブジェクトが破棄されるとGCが自動的に呼び出すため、ファイナライズは保護されます。 Finalizeを呼び出さないでください。ブール値 処分する コードがオブジェクトの破棄を開始したか(True)、GCがオブジェクトを破棄したか(コードの一部として) ファイナライズ サブ。ブール値を使用する唯一のコードに注意してください 処分する は:

If破棄Then '他の状態(管理オブジェクト)を解放します。終了する

オブジェクトを破棄するときは、そのリソースをすべて破棄する必要があります。 CLRガベージコレクターがオブジェクトを破棄する場合、ガベージコレクターが管理対象リソースを自動的に処理するため、管理対象外リソースのみを破棄する必要があります。

このコードスニペットの背後にある考え方は、指定された場所で管理対象オブジェクトと管理対象外オブジェクトを処理するコードを追加することです。

IDisposableを実装する基本クラスからクラスを派生させる場合、破棄する必要がある他のリソースを使用しない限り、基本メソッドをオーバーライドする必要はありません。その場合、派生クラスは基本クラスのDispose(disposing)メソッドをオーバーライドして、派生クラスのリソースを破棄する必要があります。ただし、基本クラスのDispose(disposing)メソッドを呼び出すことを忘れないでください。

保護されたオーバーライドSub Dispose(ByVal disposing As Boolean)If Not Me.disposed Then If disposing Then 'コードを追加して、マネージリソースを解放します。 End If 'コードを追加して、アンマネージリソースを解放します。 MyBase.Dispose(disposing)End Subの場合は終了

被写体はわずかに圧倒されます。ここでの説明の目的は、実際に何が起こっているのかを「わかりやすく」することです。見つけることができる情報のほとんどは、あなたに教えてくれないからです!