КОНЦЕПЦИЯ .NET ЗАДАЧА КОНЦЕПЦИИ - PullRequest
2 голосов
/ 05 июля 2010

Неужели лучше не использовать финализировать сравнение для удаления? Удаляет ли удалить неуправляемый ресурс при первом разборе?

Что такое подавление финализации?

Ответы [ 3 ]

4 голосов
/ 05 июля 2010

Ваша реализация IDisposable должна быть:

public MyClass : IDisposable
{
     public void Dispose() 
     {
         Dispose(true);
         GC.SuppressFinalize(this);
     }

     protected Dispose(bool disposing) 
     {
         if( disposing )
         {
             // release unmanaged resource
         }
         // release managed resources
     }

     ~MyClass() 
     {
         Dispose(false);
     }
}

Если у объекта есть финализатор, CLR сохраняет ссылку на него в очереди финализации. Если вы удаляете объект вручную (вызывая Dispose ()), вы уже удаляете неуправляемые ресурсы (так как реализация dispose и финализатор используются совместно), поэтому нет необходимости вызывать финализатор и вы можете безопасно удалить объект из финализации очередь (вызывая GC.SuppressFinalize (this)).

1 голос
/ 06 июля 2010

Я написал сообщение в блоге Как реализовать IDisposable и финализаторы: 3 простых правила , которые довольно подробно описывают, когда и как их использовать. У меня также есть несколько вопросов и ответов по теме .

Печально известная документация Microsoft о том, как реализовать IDisposable (и соответствующее правило FxCop), ужасно устарела. Они точно описывают, как Microsoft реализовала IDisposable ... в .NET 1.0. Когда вышла версия 2.0, почти все классы в BCL были модифицированы в соответствии с рекомендациями, аналогичными описанным в моем блоге (единственное отличие состоит в том, что Microsoft имеет защищенную Dispose(bool) для классов, разработанных для использования в качестве базовых классов). В частности, ни один класс BCL, насколько мне известно, не отвечает за управляемые и неуправляемые ресурсы.

0 голосов
/ 05 июля 2010

Обычно и Dispose, и Finalize очищают любые неуправляемые ресурсы (например, дескрипторы). Когда GC обнаруживает, что объект больше не используется, происходит одна из двух вещей.В лучшем случае, если объект не нужно завершать (у него нет неуправляемых ресурсов или кто-то, называемый suppress finalize), тогда он очищается прямо сейчас.В худшем случае, он помещается в другую область для вещей, которые необходимо доработать, и живет дольше (дольше хранится за этими неуправляемыми ресурсами), пока в конечном итоге не завершится работа финализатора и не будет полностью очищен объект.

НаличиеМногие объекты, требующие доработки, могут значительно повлиять на производительность.Утилизация служит двум целям: она возвращает неуправляемые ресурсы и подавляет финализатор (при условии, что вы правильно реализовали Dispose), что дает GC перерыв.Тем не менее, люди могут забыть вызвать Dispose (или использовать Using), так что финализатор должен существовать.Просто постарайтесь не полагаться на это.

...