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


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

См. также

Ссылки

Правила использования атрибутов