CA1821: удаляйте пустые методы завершения
TypeName |
RemoveEmptyFinalizers |
CheckId |
CA1821 |
Категория |
Microsoft.Performance |
Критическое изменение |
Не критическое |
Причина
Тип реализует пустой финализатор, вызывает только финализатор базового типа или вызывает только условно создаваемые методы.
Описание правила
Если возможно, старайтесь не использовать финализаторы, поскольку из-за отслеживания жизненного срока объектов снижается производительность программы.Сборщик мусора запустит финализатор перед сбором объекта.Это означает, что для сбора объекта требуются две коллекции.Таким образом, наличие пустого финализатора приводит к значительному снижению производительности и к расходу вычислительных ресурсов впустую.
Устранение нарушений
Удалите пустой финализатор.Если финализатор нужен для отладки, заключите весь финализатор в директивы #if DEBUG / #endif.
Отключение предупреждений
Не следует отключать вывод предупреждений для этого правила.Неотключенные финализаторы снижают производительность программы и не дают преимуществ.
Пример
В следующем примере показан пустой финализатор, который нужно удалить; финализатор, который нужно заключить в директивы #if DEBUG / #endif и финализатор, правильно использующий директивы #if DEBUG / #endif.
using System.Diagnostics;
public class Class1
{
// Violation occurs because the finalizer is empty.
~Class1()
{
}
}
public class Class2
{
// Violation occurs because Debug.Fail is a conditional method.
// The finalizer will contain code only if the DEBUG directive
// symbol is present at compile time. When the DEBUG
// directive is not present, the finalizer will still exist, but
// it will be empty.
~Class2()
{
Debug.Fail("Finalizer called!");
}
}
public class Class3
{
#if DEBUG
// Violation will not occur because the finalizer will exist and
// contain code when the DEBUG directive is present. When the
// DEBUG directive is not present, the finalizer will not exist,
// and therefore not be empty.
~Class3()
{
Debug.Fail("Finalizer called!");
}
#endif
}