Поделиться через


CA1859: используйте конкретные типы, если это возможно для повышения производительности

Свойство Значение
Идентификатор правила CA1859
Заголовок Использование конкретных типов, когда это возможно для повышения производительности
Категория Производительность
Исправление является критическим или не критическим Не критическое
Представленные версии .NET 8
Включен по умолчанию в .NET 8 Как предложение

Причина

Код использует типы интерфейса или абстрактные типы, что приводит к ненужным вызовам интерфейса или виртуальным вызовам.

Описание правила

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

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

Устранение нарушений

Обновите типы, как рекомендуется правилом. Как правило, изменение типа не влияет на поведение кода, но повышает его производительность.

Пример

В следующем фрагменте кода показано нарушение CA1859:

abstract class A
{
    public virtual void M() { }
}

sealed class B : A
{ }

internal class C
{
    private readonly A _a = new B();

    public void Trigger()
    {
        // This performs a virtual call because
        // _a is defined as an abstract class.
        _a.M();
    }
}

Следующий фрагмент кода исправляет нарушение.

abstract class A
{
    public virtual void M() { }
}

sealed class B : A
{ }

internal class C
{
    private readonly B _b = new B();

    public void Trigger()
    {
        _b.M();
    }
}

Когда лучше отключить предупреждения

Это безопасно для подавления предупреждения, если производительность не является проблемой.

Отключение предупреждений

Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.

#pragma warning disable CA1859
// The code that's violating the rule is on this line.
#pragma warning restore CA1859

Чтобы отключить правило для файла, папки или проекта, задайте его серьезность none в файле конфигурации.

[*.{cs,vb}]
dotnet_diagnostic.CA1859.severity = none

Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.