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
Связанные правила
- CA1019: необходимо определять методы доступа для аргументов атрибутов
- CA1018: помечайте атрибуты как AttributeUsageAttribute