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