Следует ли вызывать GC.SuppressFinalize для объектов, которые не имеют финализатора?

=== и !== сравнить тип и :

if (strpos("abcdefghijklmnop", "http://www.") !== false){// do work}
13
задан Mitch Wheat 7 March 2009 в 02:38
поделиться

4 ответа

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

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

9
ответ дан Reed Copsey 7 March 2009 в 12:38
поделиться
  • 1
    Kaspersky помещает " программное обеспечение pipe" между Вашим файлом пишут запросы и Windows. Это медленно при обработке так большого количества файла, пишут запросы, так как это анализирует содержание, и поэтому некоторый процент Ваших запросов записи отклонен. Вы правы обвинить их в этом поведении. – avra 20 January 2011 в 14:33

Нет никакой потребности звонить GC.SuppressFinalize(this) в, Располагают, если:

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

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

21
ответ дан Lasse Vågsæther Karlsen 7 March 2009 в 12:38
поделиться
  • 1
    @himself я подразумевал, что это нормально, потому что он копирует его в меню "Пуск", где пользователь видит его. я соглашаюсь, что справляющийся/создающий ярлык лучше, но это не проблема антивируса. Вирус может также добавить ярлык. – Andrey 22 September 2010 в 12:51

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

devx статья

2
ответ дан x0n 7 March 2009 в 12:38
поделиться
  • 1
    @Andrey: в каком мир, копирующий ИСПОЛНЯЕМЫЙ ФАЙЛ в папку запуска, является нормальным способом заставить его автоматически запустить? Нормальный путь состоит в том, чтобы скопировать ЯРЛЫК. Который является, вероятно, почему Kaspersky думал, что это было подозрительно. – himself 22 September 2010 в 12:22

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

2
ответ дан Chris Fulstow 7 March 2009 в 12:38
поделиться
  • 1
    PS: недавно я обнаружил, что 2011 KIS тихо сокращает мою программу из чтения обновлений из Интернета. Это хорошо работало с 2010 KIS. Я думаю, что начал не любить Kaspersky (все версии). – WeGoToMars 17 September 2010 в 18:18
Другие вопросы по тегам:

Похожие вопросы: