Отвечая на оригинальный вопрос, с информацией, предоставленной до сих пор оригинальным постером, он на 100% уверен, что он не знает достаточно о программировании в .NET, чтобы даже получить ответ: используйте GC.Collect () , Я бы сказал, что с вероятностью 99,99% ему вообще не нужно использовать GC.Collect (), как указывалось в большинстве постеров.
Правильный ответ сводится к: «Пусть GC сделает свою работу. Период. У вас есть другие вещи, чтобы беспокоиться о. Но вы, возможно, захотите подумать, нужно ли и когда удалять или очищать определенные объекты, и нужно ли вам реализовать IDisposable и, возможно, Finalize в вашем классе. '
Относительно должности Кейта и его Правила № 4:
Некоторые постеры сбивают с толку правило 3 и правило 4. Правило Кейта 4 абсолютно правильно, однозначно. Это единственное правило из четырех, которое вообще не нуждается в редактировании. Я бы немного перефразировал некоторые другие его правила, чтобы прояснить их, но они, по сути, правильны, если вы их правильно проанализируете, и прочитаете весь пост, чтобы увидеть, как он их расширяет.
Если ваш класс не использует неуправляемый ресурс И он также никогда не создает экземпляр другого объекта класса, который сам использует, прямо или в конечном счете, неуправляемый объект (т. Е. Класс, реализующий IDisposable), тогда не нужно, чтобы ваш класс сам реализовывал IDisposable или даже вызывал .dispose для чего-либо. (В таком случае глупо думать, что вам действительно нужно немедленно освободить память с помощью принудительного сбора данных, в любом случае.)
Если ваш класс использует неуправляемый ресурс, ИЛИ создает экземпляр другого объекта, который сам реализует IDisposable, то ваш класс должен либо:
a) немедленно утилизировать / освободить их в локальном контексте, в котором они были созданы, ИЛИ ...
b) внедрить IDisposable в соответствии с шаблоном, рекомендованным в сообщении Кейта, или в нескольких тысячах мест в Интернете, или буквально в 300 книгах к настоящему времени.
b.1) Кроме того, если (b), и это неуправляемый ресурс, который был открыт, как IDisposable, так и Finalize ДОЛЖНЫ быть ВСЕГДА реализованы, согласно правилу Кейта # 4.
В этом контексте Finalize абсолютно ЕСТЬ сеть безопасности в одном смысле: если кто-то создает экземпляр ВАШЕГО IDisposable объекта, который использует неуправляемый ресурс, и ему не удается вызвать dispose, то Finalize - это последний шанс для ВАШЕГО объекта правильно закрыть неуправляемый ресурс.
(Finalize должен делать это, вызывая Dispose таким образом, чтобы метод Dispose пропускал освобождение чего-либо, НО неуправляемый ресурс. В качестве альтернативы, если метод Dispose вашего объекта правильно вызывается любым экземпляром вашего объекта, то он ОБА передает вызов Dispose для все объекты IDisposable, в которых он создан, И освобождает неуправляемые ресурсы должным образом, заканчивая вызовом для подавления Finalize на вашем объекте, что означает, что влияние использования Finalize уменьшается, если вызывающий объект правильно расположил ваш объект. включены в сообщение Кита, кстати.)
b.2) ЕСЛИ ваш класс реализует только IDisposable, потому что ему необходимо по существу передать Dispose для объекта IDisposable, который он создал, а затем не реализовывать метод Finalize в вашем классе в этом случае. Finalize предназначен для обработки случая, когда BOTH Dispose никогда не вызывался каким-либо экземпляром вашего объекта, И был использован неуправляемый ресурс, который все еще не выпущен.
Короче говоря, в отношении поста Кита он совершенно прав, и этот пост, на мой взгляд, является наиболее правильным и полным ответом. Он может использовать некоторые краткие заявления, которые некоторые находят «неправильными» или на которые они возражают, но его полный пост полностью раскрывает использование Finalize, и он абсолютно прав. Обязательно прочитайте его пост полностью, прежде чем прыгать по одному из правил или предварительных утверждений в его посте.