Слабые ссылки и одноразовые предметы - PullRequest
5 голосов
/ 15 мая 2010

В C # можно создавать слабые ссылки на объекты, как описано здесь:

Класс слабой ссылки

В .net некоторые классы также реализуют интерфейс IDisposable. Вызов метода Dispose этого интерфейса выполняется для ручного удаления любых управляемых или неуправляемых ресурсов, которые в настоящее время удерживаются. Примером может быть растровый объект или класс.

Если я назначу объект, который реализует IDisposable для слабой ссылки, будет ли вызван Dispose, если слабая ссылка собирает объект?

Ответы [ 4 ]

5 голосов
/ 15 мая 2010

В общем, ответ действительно нет.

Однако, правильно реализованный класс, который реализует IDisposable, используя IDisposable шаблон (надеюсь, все классы .NET делают это). Также будет реализован финализатор, который вызывается, когда объект собирается мусором, а внутри финализатора он вызывает Dispose. Таким образом, для всех правильных реализаций IDisposable будет вызван метод Dispose.

(Примечание: контр-пример Фернандо неправильно реализует IDisposable)

5 голосов
/ 15 мая 2010

GC никогда не вызывает Dispose. Утилизация должна вызываться кодом пользователя.

2 голосов
/ 15 мая 2010

Нет. Просто так;)

1 голос
/ 15 мая 2010

Нет.Проверьте этот тест:

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.

...