6

C# では、ここで説明されているように、オブジェクトへの弱い参照を作成できます。

WeakReference クラス

.net では、IDisposable インターフェイスを実装するクラスもあります。このインターフェイスの Dispose メソッドの呼び出しは、現在保持されているマネージド リソースまたはアンマネージド リソースを手動で破棄するために実行されます。例として、Bitmap オブジェクトまたはクラスがあります。

IDisposable を実装するオブジェクトを弱参照に割り当てた場合、弱参照がオブジェクトを収集すると Dispose が呼び出されますか?

4

4 に答える 4

8

一般的に、答えは確かにノーです。

ただし、 IDisposable パターンIDisposableを使用して実装する適切に実装されたクラス(うまくいけば、すべての .NET クラスがこれを行います)。オブジェクトがガベージ コレクションされたときに呼び出されるファイナライザーも実装し、ファイナライザー内で を呼び出します。したがって、 のすべての適切な実装に対して、メソッドが呼び出されます。DisposeIDisposableDispose

(注: Fernando による反例はIDisposable適切に実装されていません)

于 2010-05-15T19:26:03.860 に答える
6

GCがDisposeを呼び出すことはありません。Disposeは、ユーザーコードで呼び出す必要があります。

于 2010-05-15T18:25:10.483 に答える
2

いいえ、そのように単純です;)

于 2010-05-15T18:21:09.007 に答える
1

いいえ。このテストを確認してください。

class Program {
        static void Main(string[] args) {
            Test test = new Test();
            Console.WriteLine(test.Disposable == null);
            GC.Collect();
            Console.WriteLine(test.Disposable == null);
            Console.ReadLine();
        }
    }

    public class Test {
        private WeakReference disposable = new WeakReference(new WeakDisposable());
        public WeakDisposable Disposable {
            get { return disposable.Target as WeakDisposable; }
        }
    }

    public class WeakDisposable : IDisposable {
        ~WeakDisposable() {
            Console.WriteLine("Destructor");
        }
        public void Dispose() {
            Console.WriteLine("Dispose");
        }
    }

出力は次のとおりです。

False
True
Destructor

ご覧のとおり、実行がDisposeメソッドにヒットすることはありません。

于 2010-05-15T18:33:18.170 に答える