CA1813: Undvik oförseglade attribut
Property | Värde |
---|---|
Regel-ID | CA1813 |
Title | Undvik oförseglade attribut |
Kategori | Prestanda |
Korrigeringen är icke-bakåtkompatibel | Brott |
Aktiverad som standard i .NET 9 | Nej |
Orsak
En offentlig typ ärver från System.Attribute, är inte abstrakt och är inte förseglad (NotInheritable
i Visual Basic).
Regelbeskrivning
.NET tillhandahåller metoder för att hämta anpassade attribut. Som standard söker dessa metoder i arvshierarkin för attribut. Söker till exempel System.Attribute.GetCustomAttribute efter den angivna attributtypen eller någon attributtyp som utökar den angivna attributtypen. Genom att försegla attributet eliminerar du sökningen genom arvshierarkin och kan förbättra prestandan.
Så här åtgärdar du överträdelser
Om du vill åtgärda en överträdelse av den här regeln förseglar du attributtypen eller gör den abstrakt.
När du ska ignorera varningar
Det är säkert att ignorera en varning från den här regeln. Utelämna endast om du definierar en attributhierarki och inte kan försegla attributet eller göra det abstrakt.
Ignorera en varning
Om du bara vill förhindra en enda överträdelse lägger du till förprocessordirektiv i källfilen för att inaktivera och aktiverar sedan regeln igen.
#pragma warning disable CA1813
// The code that's violating the rule is on this line.
#pragma warning restore CA1813
Om du vill inaktivera regeln för en fil, mapp eller ett projekt anger du dess allvarlighetsgrad till none
i konfigurationsfilen.
[*.{cs,vb}]
dotnet_diagnostic.CA1813.severity = none
Mer information finns i Så här utelämnar du kodanalysvarningar.
Exempel
I följande exempel visas ett anpassat attribut som uppfyller den här regeln.
// 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;
}
}
}
Imports System
Namespace ca1813
' Satisfies rule: AvoidUnsealedAttributes.
<AttributeUsage(AttributeTargets.Class Or AttributeTargets.Struct)>
Public NotInheritable Class DeveloperAttribute
Inherits Attribute
Public Sub New(name As String)
Me.Name = name
End Sub
Public ReadOnly Property Name() As String
End Class
End Namespace
Relaterade regler
- CA1019: Definiera accessorer för attributargument
- CA1018: Markera attribut med AttributeUsageAttribute