Teilen über


CA1813: Nicht versiegelte Attribute vermeiden.

Eigenschaft Wert
Regel-ID CA1813
Titel Nicht versiegelte Attribute vermeiden.
Kategorie Leistung
Fix führt oder führt nicht zur Unterbrechung Breaking
Standardmäßig in .NET 8 aktiviert Nein

Ursache

Ein öffentlicher Typ erbt von System.Attribute, ist nicht abstrakt und nicht versiegelt (NotInheritable in Visual Basic).

Regelbeschreibung

.NET stellt Methoden zum Abrufen benutzerdefinierter Attribute bereit. Standardmäßig wird mit diesen Methoden die Attributvererbungshierarchie durchsucht. Beispielsweise sucht System.Attribute.GetCustomAttribute nach dem angegebenen Attributtyp oder nach einem beliebigen Attributtyp, der den angegebenen Attributtyp erweitert. Durch Verwendung eines versiegelten Attributs wird das Durchsuchen der Vererbungshierarchie unterbunden und die Leistung u. U. verbessert.

Behandeln von Verstößen

Um einen Verstoß gegen diese Regel zu beheben, versiegeln Sie den Attributtyp oder machen Sie ihn abstrakt.

Wann sollten Warnungen unterdrückt werden?

Eine Warnung, die auf dieser Regel basiert, kann problemlos unterdrückt werden. Unterdrücken Sie nur, wenn Sie eine Attribut-Hierarchie definieren und das Attribut nicht versiegeln oder abstrahieren können.

Unterdrücken einer Warnung

Um nur eine einzelne Verletzung zu unterdrücken, fügen Sie der Quelldatei Präprozessoranweisungen hinzu, um die Regel zu deaktivieren und dann wieder zu aktivieren.

#pragma warning disable CA1813
// The code that's violating the rule is on this line.
#pragma warning restore CA1813

Um die Regel für eine Datei, einen Ordner oder ein Projekt zu deaktivieren, legen Sie den Schweregrad in der Konfigurationsdatei auf none fest.

[*.{cs,vb}]
dotnet_diagnostic.CA1813.severity = none

Weitere Informationen finden Sie unter Vorgehensweise: Unterdrücken von Codeanalyse-Warnungen.

Beispiel

Das folgende Beispiel zeigt ein benutzerdefiniertes Attribut, das diese Regel erfüllt.

// 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

Siehe auch