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


Помечайте атрибуты как AttributeUsageAttribute

Обновлен: Ноябрь 2007

TypeName

MarkAttributesWithAttributeUsage

CheckId

CA1018

Категория

Microsoft.Design

Критическое изменение

Критическое

Причина

Атрибут System.AttributeUsageAttribute отсутствует у настраиваемого атрибута.

Описание правила

При определении настраиваемого атрибута его нужно пометить как AttributeUsageAttribute, чтобы указать, где можно применить настраиваемый атрибут в исходном коде. Положение атрибута в коде зависит от значения атрибута и его применения. Например, если мы определяем атрибут, который идентифицирует человека, ответственного за поддержку и расширение каждого типа в библиотеке, а ответственность всегда назначается на уровне типа, компиляторы должны допускать применение этого атрибута к классам, перечислениям и интерфейсам, но не должны допускать его применение к методам, событиям и свойствам. Возможность применения атрибута к сборкам зависит от организационных политик и процедур.

Перечисление System.AttributeTargets определяет целевые объекты для пользовательского атрибута. Если опустить AttributeUsageAttribute, то пользовательский атрибут будет доступен для всех целевых объектов согласно All

Устранение нарушений

Чтобы устранить нарушение этого правила, укажите целевые объекты для атрибута с помощью AttributeUsageAttribute. См. следующий пример.

Отключение предупреждений

Вместо отключения предупреждений следует устранить нарушение этого правила. Даже если атрибут наследует AttributeUsageAttribute, атрибут должен присутствовать, поскольку в этом случае упрощается обслуживание кода.

Пример

В следующем примере определены два атрибута. В BadCodeMaintainerAttribute неверно опущен оператор AttributeUsageAttribute, а в GoodCodeMaintainerAttribute правильно реализован описанный выше атрибут. Обратите внимание, что свойство DeveloperName необходимо по правилу проектирования Определять методы доступа для аргументов атрибутов и включено для полноты.

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;
         }
      }
   }
}

Связанные правила

Определять методы доступа для аргументов атрибутов

Не допускайте использования распечатанных атрибутов

См. также

Ссылки

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

System.AttributeTargets