Бөлісу құралы:


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

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

Причина

Общедоступный тип наследует от 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
{
    public DeveloperAttribute(string name)
    {
        Name = name;
    }

    public string Name { get; }
}
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

См. также