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


CA1813: не допускайте использования распечатанных атрибутов

Свойство Значение
Идентификатор правила CA1813
Заголовок Избегайте незапечатанных атрибутов
Категория Производительность
Исправление является критическим или не критическим Критическое
Включен по умолчанию в .NET 8 No

Причина

Общедоступный тип наследует от System.Attribute, не является абстрактным и не запечатан (NotInheritable в Visual Basic).

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

.NET предоставляет методы для извлечения настраиваемых атрибутов. По умолчанию эти методы осуществляют поиск иерархии наследования атрибутов. Например, System.Attribute.GetCustomAttribute ищет указанный тип атрибута или любой тип атрибута, который расширяет указанный тип атрибута. Если запечатать атрибут, поиск в иерархии наследования выполняться не будет, в результате чего может повыситься производительность.

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

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

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

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

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

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

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

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

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

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

Пример

В следующем примере показан настраиваемый атрибут, который соответствует этому правилу.

// Satisfies rule: AvoidUnsealedAttributes.
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)]
public sealed class DeveloperAttribute : Attribute
{
    private string nameValue;
    public DeveloperAttribute(string name)
    {
        nameValue = name;
    }

    public string Name
    {
        get
        {
            return nameValue;
        }
    }
}
Imports System

Namespace ca1813

    ' Satisfies rule: AvoidUnsealedAttributes.
    <AttributeUsage(AttributeTargets.Class Or AttributeTargets.Struct)>
    Public NotInheritable Class DeveloperAttribute
        Inherits Attribute

        Public Sub New(name As String)
            Me.Name = name
        End Sub


        Public ReadOnly Property Name() As String
    End Class

End Namespace

См. также