CA1813: Evitare attributi non sealed

Proprietà valore
ID regola CA1813
Titolo Evitare attributi unsealed
Categoria Prestazioni
Correzione che causa un'interruzione o un'interruzione Interruzione
Abilitato per impostazione predefinita in .NET 8 No

Causa

Un tipo pubblico eredita da System.Attribute, non è astratto e non è sealed (NotInheritable in Visual Basic).

Descrizione regola

.NET fornisce metodi per il recupero di attributi personalizzati. Per impostazione predefinita, questi metodi eseguono ricerche nella gerarchia di ereditarietà dell'attributo. Ad esempio, System.Attribute.GetCustomAttribute cerca il tipo di attributo specificato o qualsiasi tipo di attributo che estende il tipo di attributo specificato. La chiusura dell'attributo elimina la ricerca tramite la gerarchia di ereditarietà e può migliorare le prestazioni.

Come correggere le violazioni

Per correggere una violazione di questa regola, bloccare il tipo di attributo o renderlo astratto.

Quando eliminare gli avvisi

È sicuro eliminare un avviso da questa regola. Eliminare solo se si definisce una gerarchia di attributi e non è possibile bloccare l'attributo o renderlo astratto.

Eliminare un avviso

Se si vuole eliminare una singola violazione, aggiungere direttive del preprocessore al file di origine per disabilitare e quindi riabilitare la regola.

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

Per disabilitare la regola per un file, una cartella o un progetto, impostarne la gravità none su nel file di configurazione.

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

Per altre informazioni, vedere Come eliminare gli avvisi di analisi del codice.

Esempio

Nell'esempio seguente viene illustrato un attributo personalizzato che soddisfa questa regola.

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

Vedi anche