Слабые ссылки и Доступные объекты

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

Класс WeakReference

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

Если я присвою объект, который реализует IDisposable к слабой ссылке, то Расположит, названы, если слабая ссылка собирает объект?

5
задан MatthewMartin 17 October 2012 в 21:34
поделиться

4 ответа

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

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

(Примечание: контрпример Фернандо не реализует IDisposable должным образом)

5
ответ дан 18 December 2019 в 13:11
поделиться

Нет. Вот так просто;)

2
ответ дан 18 December 2019 в 13:11
поделиться

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

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 .

1
ответ дан 18 December 2019 в 13:11
поделиться

Сборщик мусора никогда не вызывает Dispose. Dispose должен вызываться кодом пользователя.

6
ответ дан 18 December 2019 в 13:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: