Share via


CA1813: Undvik oförseglade attribut

Property Värde
Regel-ID CA1813
Rubrik Undvik oförseglade attribut
Kategori Prestanda
Korrigeringen är icke-bakåtkompatibel Bryta
Aktiverad som standard i .NET 8 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

Se även