Следует ли вызывать GC.SuppressFinalize для объектов, которые не имеют финализатора? - PullRequest
13 голосов
/ 07 марта 2009

По какой-то причине FXCop, кажется, думает Я должен вызывать GC.SuppressFinalize в Dispose, независимо от того, есть ли у меня финализатор или нет.

Я что-то упустил? Есть ли причина вызывать GC.SuppressFinalize для объектов, для которых не определен финализатор?

Ответы [ 4 ]

21 голосов
/ 07 марта 2009

Нет необходимости звонить GC.SuppressFinalize(this) в Dispose, если:

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

Я бы сказал, если у вас нет ни одного из вышеперечисленных случаев, что вы можете спокойно проигнорировать это сообщение.

9 голосов
/ 07 марта 2009

В IL всегда есть финализатор - System.Object.Finalize () существует в каждом классе, поэтому, если вы создаете собственный класс, у него есть финализатор, который вы хотите подавить. При этом не все объекты помещаются в очередь на финализацию, поэтому вам нужно только технически подавлять финализацию, если вы реализуете свой собственный финализатор.

Если вы реализуете IDisposable для переноса неуправляемых ресурсов, вы должны включить финализатор, и вы должны запретить его запуск, поскольку теоретически вы выполняете очистку уже при вызове Dispose.

2 голосов
/ 07 марта 2009

Я не вижу необходимости вызывать SuppressFinalize (), если финализатор не определен. Если вы хотите быть защитником, тогда может быть полезно иметь финализатор и Dispose (), поэтому вам не нужно полагаться на клиентов, которые всегда вызывают Dispose (). Тогда вы не потеряете ресурсы, когда они забудут.

2 голосов
/ 07 марта 2009

Все объекты имеют метод финализатора, даже если вы не реализовали его с помощью деструктора c # (который на самом деле не гарантирован, будет вызван GC). Это просто хорошая практика, чтобы подавить вызов, если вы внедрили IDisposable, потому что это означает, что вы решили выполнить финализацию явно.

статья devx

...