Предположим, у меня есть этот код:
class MonkeyGrabber : IDisposable {
public MonkeyGrabber() { /* construction grabs a real, live monkey from the cage */
public void Dispose() { Dispose(true); /* releases the monkey back into the cage */ }
// the rest of the monkey grabbing is left as an exercise to grad student drones
}
class MonkeyMonitor {
public void CheckMonkeys() {
if (_monkeyPool.GettingTooRowdy()) {
MonkeyGrabber grabber = new MonkeyGrabber();
grabber.Spank();
}
}
}
Теперь, мой MonkeyMonitor проверяет обезьян и, если они слишком шумные, он получает ценный системный ресурс - единственный коготь обезьяны, прикрепленный к системе, и использует его, чтобы схватить обезьяну и отшлепать ее. Так как я не избавился от нее, обезьяний коготь все еще держит обезьяну, висящую над остальной клеткой. Если остальные обезьяны продолжат хулиганить, я не смогу сделать новый MonkeyGrabber, так как он все еще помогает. К сожалению. Придуманный пример, но вы понимаете: объекты, которые реализуют IDisposable, могут удерживать ограниченные ресурсы, которые должны быть выпущены своевременно. GC может отпустить в конце концов или нет.
Кроме того, некоторые ресурсы должны быть своевременно освобождены. У меня есть набор классов, которые, если они не будут удалены ни приложением, ни GC до выхода из приложения, приведут к серьезному сбою приложения, так как неуправляемый менеджер ресурсов, из которого они вышли, уже исчезнет к тому времени, когда GC доберется до него .
Подробнее об IDisposable .
использует ваш друг - это самое близкое, что мы имеем до RAII .