Condividi tramite


sealed (Riferimenti per C#)

Quando si applica il sealed modificatore a una classe, impedisce ad altre classi di ereditare da tale classe. Nell'esempio seguente la classe B eredita dalla classe A, ma nessuna classe può ereditare dalla classe B.

class A {}
sealed class B : A {}

È anche possibile usare il modificatore sealed su un metodo o una proprietà che esegue l'override di un metodo virtuale o di una proprietà in una classe di base. Usando questo approccio, è possibile consentire agli sviluppatori di derivare classi dalla classe impedendo loro di eseguire l'override di metodi o proprietà virtuali specifici.

Il riferimento al linguaggio C# documenta la versione rilasciata più di recente del linguaggio C#. Contiene anche la documentazione iniziale per le funzionalità nelle versioni di anteprima pubblica per la prossima versione del linguaggio di programmazione.

La documentazione identifica tutte le funzionalità introdotte nelle ultime tre versioni della lingua o nelle anteprime pubbliche correnti.

Suggerimento

Per trovare quando una funzionalità è stata introdotta per la prima volta in C#, vedere l'articolo sulla cronologia delle versioni del linguaggio C#.

Nell'esempio Z seguente eredita da Y ma Z non può eseguire l'override della funzione F virtuale dichiarata in X e sealed in Y.

class X
{
    protected virtual void F() { Console.WriteLine("X.F"); }
    protected virtual void F2() { Console.WriteLine("X.F2"); }
}

class Y : X
{
    sealed protected override void F() { Console.WriteLine("Y.F"); }
    protected override void F2() { Console.WriteLine("Y.F2"); }
}

class Z : Y
{
    // Attempting to override F causes compiler error CS0239.
    // protected override void F() { Console.WriteLine("Z.F"); }

    // Overriding F2 is allowed.
    protected override void F2() { Console.WriteLine("Z.F2"); }
}

Quando si definiscono nuovi metodi o proprietà in una classe, è possibile impedire la derivazione delle classi eseguendo l'override di tali classi non dichiarandole come virtuale . Quando si esegue l'override di un virtual membro dichiarato in un tipo di base, è possibile impedire la derivazione dei tipi tramite la sealed parola chiave , come illustrato nell'esempio seguente:

public sealed override string ToString() => Value;

È un errore usare il modificatore astratto con una classe sealed, perché una classe astratta deve essere ereditata da una classe che fornisce un'implementazione dei metodi o delle proprietà astratti.

Quando si applica il sealed modificatore a un metodo o a una proprietà, usarlo sempre con override.

Poiché gli struct sono sealed in modo implicito, non è possibile ereditarli da essi.

Per ulteriori informazioni, consultare il capitolo Ereditarietà.

Per altri esempi, vedere classi astratte e sigillate, e membri della classe.

sealed class SealedClass
{
    public int x;
    public int y;
}

class SealedTest2
{
    static void Main()
    {
        var sc = new SealedClass();
        sc.x = 110;
        sc.y = 150;
        Console.WriteLine($"x = {sc.x}, y = {sc.y}");
    }
}
// Output: x = 110, y = 150

Nell'esempio precedente è possibile provare a ereditare dalla classe sealed usando l'istruzione seguente:

class MyDerivedC: SealedClass {} // Error

Il risultato è un messaggio di errore:

'MyDerivedC': cannot derive from sealed type 'SealedClass'

Per determinare se bloccare una classe, un metodo o una proprietà, considerare in genere i due punti seguenti:

  • I vantaggi potenziali che le classi derivanti potrebbero ottenere grazie alla possibilità di personalizzare la vostra classe.
  • Il potenziale che deriva le classi potrebbe modificare le classi in modo che non funzionino più correttamente o come previsto.

Specifica del linguaggio C#

Per ulteriori informazioni, consulta le Specifiche del linguaggio C# . La specifica del linguaggio è l'origine definitiva per la sintassi e l'utilizzo di C#.

Vedere anche