В C# возможно создать слабые ссылки на объекты, как описано здесь:
В .NET некоторые классы также реализуют интерфейс IDisposable. Вызов Расположить метод этого интерфейса выполняется для ручного избавления от любых управляемых или неуправляемых ресурсов, в настоящее время сохраненных на. Примером мог бы быть Растровый объект или класс.
Если я присвою объект, который реализует IDisposable к слабой ссылке, то Расположит, названы, если слабая ссылка собирает объект?
В общем, ответ действительно нет.
Однако правильно реализованный класс, который реализует IDisposable
с использованием IDisposable pattern (надеюсь, все классы .NET это делают). Также будет реализован финализатор, который вызывается, когда объект собирается сборщиком мусора, и внутри финализатора он будет вызывать Dispose
. Итак, для всех правильных реализаций IDisposable
будет вызываться метод Dispose
.
(Примечание: контрпример Фернандо не реализует IDisposable
должным образом)
Нет. Проверьте этот тест:
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
.
Сборщик мусора никогда не вызывает Dispose. Dispose должен вызываться кодом пользователя.