2010-07-05 8 views
2

Действительно ли лучше не использовать финализацию по сравнению с распоряжением? Утилизирует удаление неуправляемого ресурса при первом анализе?.NET FINALIZE CONCEPT PROBLEM

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

ответ

4

Ваша реализация 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); 
    } 
} 

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

+0

Вздох, миф о том, что это общая реализация IDisposable, невозможно изгнать. –

+0

Можете ли вы поделиться ссылкой на то, как правильно реализовать IDisposable? – munissor

+0

См. Мой ответ. :) –

0

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

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

1

Я написал сообщение в блоге How to Implement IDisposable and Finalizers: 3 Easy Rules, которое описывает в достаточном количестве подробностей, когда и как их использовать. У меня также есть несколько Q & As on the subject.

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