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


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

TypeName

AvoidUnsealedAttributes

CheckId

CA1813

Категория

Microsoft.Performance

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

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

Причина

Открытый тип, наследующий от класса System.Attribute, не является абстрактным и запечатанным (NotInheritable в Visual Basic).

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

В библиотеке классов .NET Framework предоставляются методы для извлечения пользовательских атрибутов. По умолчанию, эти методы выполняют поиск в иерархии наследования атрибутов; например, метод Attribute.GetCustomAttribute выполняет поиск указанного типа атрибута или всех типов атрибутов, которые расширяют указанный тип. Если запечатать атрибут, поиск в иерархии наследования выполняться не будет, в результате чего может повыситься производительность.

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

Чтобы устранить нарушение данного правила, запечатайте атрибут или сделайте его абстрактным.

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

Отключение предупреждений о нарушении этого правила является безопасным. Предупреждения следует отключать в том случае, если определяется иерархия атрибутов, но запечатывание атрибута или его изменение с помощью модификатора "abstract" не представляется возможным.

Пример

В следующем примере показан пользовательский атрибут, который соответствует данному правилу.

Imports System

Namespace PerformanceLibrary

' Satisfies rule: AvoidUnsealedAttributes.
<AttributeUsage(AttributeTargets.Class Or AttributeTargets.Struct)>  _
NotInheritable Public Class DeveloperAttribute
    Inherits Attribute
    Private nameValue As String

    Public Sub New(name As String)
        nameValue = name
    End Sub


    Public ReadOnly Property Name() As String
        Get
            Return nameValue
        End Get
    End Property
End Class 

End Namespace
using System;

namespace PerformanceLibrary 
{
    // 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;
            }
        }
    }

}

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

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

CA1018: помечайте атрибуты как AttributeUsageAttribute

См. также

Ссылки

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