0

私は次のようにコーディングします:

class myclass : IDisposable
{
    public int a;

    public void Dispose()
    {
        GC.SuppressFinalize(this);
    }
}
class Program
{
    static void Main(string[] args)
    {
        myclass cl = null;
        using (myclass n = new myclass())
        {

            n.a = 10;
            cl = n;
        }

        int a = cl.a;// statement 1
    }
}

cl オブジェクトが解放された (n 個のオブジェクトが解放された) ため、ステートメント 1 は機能しないと思います。しかし、それはうまくいきます。では、ステートメント 1 で n 個のオブジェクトが本当に解放されたのでしょうか?

4

3 に答える 3

7

管理対象オブジェクトを明示的に「解放」する方法はありません。

Dispose()管理されていないリソースを解放することを目的とした、完全に通常の関数です。
それを呼び出しても、GC にはまったく影響しません。

于 2013-10-28T16:48:42.743 に答える
1

.NET のガベージ コレクターは、オブジェクトへの何らかの参照が存在する限り、オブジェクトが存在し続けることを保証します(これは、弱参照のようなものにも当てはまります。オブジェクトへの参照が弱参照のみの場合、システムはそれらを無効にします)。 ; その時点で、オブジェクトへの参照はなくなり、存在しなくなります)。

の目的は、Dispose外部エンティティが他のエンティティに損害を与える可能性がある (たとえば、ファイルへの排他的アクセスを許可する、そのファイルを他の人がアクセスできないようにする) 代わりに何かを行う外部エンティティを持つ可能性があるオブジェクトを、次のオブジェクトに変更することです。 「サービス」が不要になったことをそのようなすべてのエンティティに通知することにより、外部エンティティがその代わりに何かを行うことはなくなりました。外部エンティティのサービスを必要とするオブジェクトは、それらのエンティティがそれらのサービスの実行を停止すると使用できなくなることがよくありますが、破棄されたオブジェクトが使用できなくなるという事実は Disposeの目的ではなく、一般的な結果にすぎません。

于 2013-10-28T17:38:13.403 に答える
0

あなたの属性aは管理されたリソースです。IDisposable は、アンマネージコードまたはリソースを処理するためのインターフェイスです。

おそらく、オブジェクトが破棄されることを期待していますか? 処分とは違います。

于 2013-10-28T16:50:40.260 に答える