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