5

たとえば、私はメソッドを持っています

SomeMethod(Graphics g)
{
    ...
}

このメソッドをある方法で呼び出す場合

SomeMethod(new Graphics())

g.Dispose() グラフィックス オブジェクトは自動破棄されますか、それともメソッドの最後で手動で呼び出す必要がありますか?

SomeMethod(Graphics g)
{
    ...
    g.Dispose();
}
4

5 に答える 5

7

使い捨て可能なオブジェクトは自動破棄されません (Dispose必要に応じて呼び出すファイナライザーを実装するのが最も近い方法です)。呼び出すDispose()か、usingブロックで使用して、手動でこれを行う必要があります。

オブジェクトを自動破棄する場合は、次のようにします。

using (var g = new Graphics()) {
    SomeMethod(g);
}

using ブロックはDispose()、ブロックが終了するとすぐにメソッドが自動的に呼び出されるようにします (この場合SomeMethodは、例外が返されるかスローされた後)。

注: 可能であれば、作成した場所に近い場所にオブジェクトを配置する必要があります。有効なオブジェクトを取り込んでメソッド内で破棄すると、混乱が生じる可能性があります。

Dispose()Finalizer が呼び出されると、グラフィックスと、このインターフェイスを実装するすべてではないにしてもほとんどの BCL クラスも呼び出されます。これは、 の適切な実装の一部ですIDisposable。ただし、ファイナライザーがいつ呼び出されるかはわかりません。オブジェクトを確定的に破棄する必要がある場合は、この実装の詳細に依存しないでください。

于 2012-04-11T07:39:42.317 に答える
4

使い捨てオブジェクトを操作する適切な方法は、それらをusingブロックでラップすることです。

using (var g = new Graphics()) {
  SomeMethod(g);
}

実行がusingブロックを離れるGraphicsと、例外がスローされた場合でも、適切に破棄されます。

usingただし、ブロックを使用して明示的または暗黙的にオブジェクトを破棄しない場合でもオブジェクトはガベージ コレクション時に破棄されます (ファイナライザーが必要に応じて正しく呼び出すと仮定しますDispose)。それがいつ発生するかは制御できないため、オブジェクトによって要求されたリソースを解放する必要がなくなったらすぐに、破棄可能なオブジェクトが適切に破棄されるようにする必要があります。

于 2012-04-11T07:50:51.480 に答える
3

おそらくusingステートメントを使用する必要があります

using (var graphicsObject = new Graphics()) {
    SomeMethod(graphicsObject);
}

例外が発生した場合でも、オブジェクトは using ステートメントの最後で自動的に破棄されます。

于 2012-04-11T07:41:12.080 に答える
2

あなたの例では、引数として与えられたオブジェクトを破棄するべきではありません。そのオブジェクトはメソッドの外部で使用される可能性があるため、これはお勧めできません。ユーティリティオブジェクトの廃棄は、(通常)作成したのと同じメソッドで行う必要があります。クラス全体のオブジェクトまたは状態オブジェクトの例外。

他の回答と同様に、を使用usingしてオブジェクトを作成および破棄します。これは、データベース接続などの貴重なリソースを使用するオブジェクトでのみ実際に必要です。オブジェクトがそれを実装する場合は、管理されていない、または大量のリソースを使用することを意味するため、常にDispose()(明示的にまたはによって)呼び出す必要があると述べました。using

Dispose(どちらの方法でも)呼び出さないすべての.NET Frameworkオブジェクトは、最終的にガベージコレクターによって自動処理されます。インターフェイスの適切な実装にはIDisposable、を呼び出すデストラクタ/ファイナライザが必要Disposeです。これは、コードが間違っているという理由だけで貴重なリソースが失われないようにするためです。あなたのリソースはずっと後にリリースされるでしょうが、それらはリリースされるでしょう、そしてそれは重要です。これは、.NETのすべての使い捨てクラスの実装方法であり、すべてのクラスの実装方法IDisposableです。

コードは次のようになります。

using(Graphics g = new Graphics())
{
    SomeMethod(g)
    {
        ...
    }
}

方法に関するMicrosoftの推奨事項については、これを確認してくださいIDisposable.Dispose

于 2012-04-11T09:10:55.343 に答える
2

グラフィッククラスを確認する

public sealed class Graphics : MarshalByRefObject, 
    IDeviceContext, IDisposable

IDisposableインターフェイスを実装しているため、このusingステートメントを Graphics オブジェクトで使用すると、自動的に破棄されます。

あなたの例では

SomeMethod(Graphics g)
        {
        ...
        g.Dispose();
        }

を使用して破棄されますg.Disposeが、ベスト プラクティスはusingステートメントです。

例:

using (Graphics g = this.CreateGraphics())
{
//Do some graphics operation.
}
于 2012-04-11T07:47:30.257 に答える