CA1018: помечайте атрибуты как AttributeUsageAttribute
Свойство | Значение |
---|---|
Идентификатор правила | CA1018 |
Заголовок | Пометьте атрибуты с помощью AttributeUsageAttribute |
Категория | Проектирование |
Исправление является критическим или не критическим | Критическое |
Включен по умолчанию в .NET 9 | Как предложение |
Причина
Атрибут System.AttributeUsageAttribute отсутствует в настраиваемом атрибуте.
Описание правила
При определении настраиваемого атрибута его нужно пометить с помощью AttributeUsageAttribute, чтобы указать, где можно применять этот настраиваемый атрибут в исходном коде. Допустимое положение атрибута в коде зависит от значения атрибута и его применения. Например, можно определить атрибут, идентифицирующий лицо, ответственное за обслуживание и улучшение каждого типа в библиотеке, а также определить, что эта ответственность всегда назначается на уровне типа. В этом случае компиляторы должны включить атрибут для классов, перечислений и интерфейсов, но не должны включать его для методов, событий и свойств. Политики и процедуры организации определяют, должен ли атрибут быть включен для сборок.
Перечисление System.AttributeTargets определяет целевые объекты, которые можно указать для настраиваемого атрибута. Если опустить AttributeUsageAttribute, настраиваемый атрибут будет действителен для всех целевых объектов, как определено значением All
перечисленияAttributeTargets.
Устранение нарушений
Чтобы устранить нарушение этого правила, укажите целевые объекты для атрибута с помощью AttributeUsageAttribute. См. следующий пример.
Когда лучше отключить предупреждения
Следует устранить нарушение этого правила, не исключая сообщение. Даже если атрибут наследует AttributeUsageAttribute, атрибут должен присутствовать для упрощения обслуживания кода.
Пример
В примере ниже определены два атрибута.
BadCodeMaintainerAttribute
неправильно опускает оператор AttributeUsageAttribute,а GoodCodeMaintainerAttribute
правильно реализует атрибут, описанный ранее в этом разделе. (Свойство DeveloperName
является обязательным для правила разработки CA1019: определите методы доступа для аргументов атрибута и включается для полноты.)
using System;
namespace ca1018
{
// Violates rule: MarkAttributesWithAttributeUsage.
public sealed class BadCodeMaintainerAttribute : Attribute
{
public BadCodeMaintainerAttribute(string developerName)
{
DeveloperName = developerName;
}
public string DeveloperName { get; }
}
// Satisfies rule: Attributes specify AttributeUsage.
// This attribute is valid for type-level targets.
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Enum | AttributeTargets.Interface | AttributeTargets.Delegate)]
public sealed class GoodCodeMaintainerAttribute : Attribute
{
public GoodCodeMaintainerAttribute(string developerName)
{
DeveloperName = developerName;
}
public string DeveloperName { get; }
}
}
Imports System
Namespace ca1018
' Violates rule: MarkAttributesWithAttributeUsage.
Public NotInheritable Class BadCodeMaintainerAttribute
Inherits Attribute
Public Sub New(developerName As String)
Me.DeveloperName = developerName
End Sub 'New
Public ReadOnly Property DeveloperName() As String
End Class
' Satisfies rule: Attributes specify AttributeUsage.
' The attribute is valid for type-level targets.
<AttributeUsage(AttributeTargets.Class Or AttributeTargets.Enum Or
AttributeTargets.Interface Or AttributeTargets.Delegate)>
Public NotInheritable Class GoodCodeMaintainerAttribute
Inherits Attribute
Public Sub New(developerName As String)
Me.DeveloperName = developerName
End Sub 'New
Public ReadOnly Property DeveloperName() As String
End Class
End Namespace
Связанные правила
- CA1019: необходимо определять методы доступа для аргументов атрибутов
- CA1813: избегайте распечатанных атрибутов