Во-первых, GC.SuppressFinalize(obj)
проверяет, является ли данная ссылка ссылкой на указатель this прямого вызова метода (см. Интерактивную справку: «Параметр obj должен быть вызывающим для этого метода.») - таклюбой вызов, кроме GC.SuppressFinalize(this)
, вызовет исключение!
Во-вторых, вызов GC.SuppressFinalize(this)
означает, что GC НЕ выполняет код завершения (экземпляр удаляется из очереди завершения).Чем короче очередь финализации, тем быстрее работает сборщик мусора ... но поскольку все объекты наследуют финализатор ...
В-третьих, вызов GC.SuppressFinalize(this)
эффективно предотвратит запуск любого деструктора.Я лично считаю деструкторы запахом кода!Написание правильного кода финализатора совсем не тривиально (помните, что все ссылки могли исчезнуть ... (уже освобождены)).Кроме того, работа с неуправляемыми ресурсами должна быть выполнена с правильной реализацией IDisposable
и вызовом Dispose()
ДО сбора данных об объекте.Наличие финализатора - это только последняя линия защиты - когда никто не назвал Dispose()
.Обычно следует использовать конструкции типа using()
, которые позаботятся о вызове Dispose()
.
Подробное описание предмета см. Правильное использование интерфейса IDisposable
Итак - сделать звонок вообще - и если - где сделать звонок?Сделайте вызов, если вы не обрабатываете неуправляемые ресурсы и поэтому не имеете деструктора.Общее место внутри Dispose()
- но это не обязательно.Другой мой любимый вариант - .ctor () - хотя ссылка this
еще не полностью построена ...
Предупреждение ReSharper немного вводит в заблуждение.Он появляется в двух ситуациях - когда аргумент не является вызывающим и когда вызов не находится в Dispose()
.В вашем конкретном случае вам не следует совершать звонок.