2011-12-28 6 views
2

次のクラスを考えてみてください:使い捨てクラス

public class Level : IDisposable 
{ 
    public Level() { } 

    public void Dispose() { } 
} 

私はDisposeメソッドを呼び出した場合、私の質問は、クラスが実際に(ガベージコレクション)に配置されていますか?

例:

Level level = new Level(); 
level.Dispose(); 

感謝。

+2

「処分する」という意味を説明してください。 –

+0

ガベージコレクションを意味します。 – yonan2236

答えて

9

私がDisposeメソッドを呼び出すと、クラスは実際に破棄されますか?

によってあなたはを集めごみを意味配置された場合は、その後、いや、これは発生しません。 Disposeメソッドを呼び出すとどうなりますか?Disposeメソッドが呼び出され、その本体が実行されます。

using statementに使い捨てリソースをラップして、例外が発生した場合でも常にDisposeメソッドが呼び出されるようにすることをお勧めします。だから、代わりに手動であなたはそれを可能性があり呼び出す:オブジェクトは、いくつかのアンマネージリソースへのポインタを保持し、確定それらのリソースを解放するためのメカニズムを提供する場合

using (Level level = new Level()) 
{ 
    // ... do something with the level 
} 

通常Disposeメソッドが使用されています。

+0

どうすれば実装できますか?クラスに他のプロパティ、メソッドなどがあるとしますか? – yonan2236

+0

@ yonan2236、あなたは何について話していますか?あなたはそのような質問に対する答えをどうやって期待していますか? 'クラス内に他のプロパティやメソッドなどがあるとしますか? 'このクラスは何をしていますか?その目的は何ですか?どのような方法が使われていますか?このクラスはアンマネージリソースへのポインタを保持していますか?最初にDisposeパターンを実装する必要があると思いますか? .... –

+0

申し訳ありませんが、私の要点を得られなかった場合、私はそれをうまく説明できませんでした。 C#オタクではなく、私はこの言語を自習しています。私は私の現在のレベルで私の思考をさらに表現することはできないと思う..ちょうどこのナンセンスクエリを無視してください。これのために – yonan2236

0

IDisposableを実装する各クラスは、配置することの意味を定義します。そのような推論のラインによって、はい、あなたのクラスは、望むように処分されます。

0

いいえ、Disposeを呼び出したためにインスタンスがガベージコレクトされません。 Disposeメソッドは、インスタンスが保持するリソースを解放することができます。インスタンス自体を破棄することではありません。あなたは絶対にそれはゴミ収集になりますを意味するものではありません、それが配置されるDispose()を呼び出す場合

0

は、明確にしてくださいいない場合には、あなたの質問である私には思えます。

3

あなたは後であなたがDispose()が呼ばれたことを知る方法だと思いますか?

あなたは行うことができますいずれかnullにインスタンスを設定することで消費するコードで配置した後:

Level level = new Level(); 
//do stuff with the instance.. 
level.Dispose(); 
level = null; 

//in other place: 
if (level != null) 
{ 
    //still available 
} 

またはクラス自体に、ブールフラグを追加し、それのためのすべてのメソッドのチェック中:

public class Level : IDisposable 
{ 
    private bool disposing = false; 
    public Level() { } 

    public void Foo() 
    { 
     if (disposing) 
      return; 
     MessageBox.Show("foo"); 
    } 

    public void Dispose() 
    { 
     if (disposing) 
      return; 
     disposing = true; 
    } 
} 
+0

ありがとう。 – yonan2236

+0

@yonanが元気ですか、これはあなたが後になったことですか、それでも何かをもっと明確にする必要がありますか? –

+0

他に何もありません、ありがとう – yonan2236

0

.NETで廃棄とガベージコレクションは2つの異なるものです:

廃棄のポイントは、すべてのリソースを解放することです(手動で割り当てられたメモリのように).NETによって管理されていないか、またはファイルハンドルやネットワーク接続のようにもう不要になるとすぐに解放されることに興味を持っています。

ガベージコレクションの目的は、.NETによって管理されるメモリを解放することです(通常のオブジェクトのように)。

他の人が指摘しているように、オブジェクトが処分されると必ずガベージコレクションされるとは限りません。

関連する問題