sealed (Riferimenti per C#)sealed (C# Reference)

Quando applicato a una classe, il modificatore sealed impedisce che altre classi ereditino da esso.When applied to a class, the sealed modifier prevents other classes from inheriting from it. Nell'esempio seguente, la classe B eredita dalla classe A, ma nessuna classe può ereditare dalla classe B.In the following example, class B inherits from class A, but no class can inherit from class B.

class A {}
sealed class B : A {}

È anche possibile usare il modificatore sealed su un metodo o su una proprietà che esegue l'override di un metodo o di una proprietà virtuale in una classe di base.You can also use the sealed modifier on a method or property that overrides a virtual method or property in a base class. In questo modo è possibile consentire alle classi di derivare dalla classe e impedire l'override di proprietà o metodi virtuali specifici.This enables you to allow classes to derive from your class and prevent them from overriding specific virtual methods or properties.

EsempioExample

Nell'esempio seguente, Z eredita da Y ma Z non può eseguire l'override della funzione virtuale F dichiarata in X e bloccata in Y.In the following example, Z inherits from Y but Z cannot override the virtual function F that is declared in X and 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 alle classi derivate di eseguire l'override non dichiarandole come virtuali.When you define new methods or properties in a class, you can prevent deriving classes from overriding them by not declaring them as virtual.

È un errore usare il modificatore abstract con una classe sealed, poiché la classe astratta deve essere ereditata da una classe che fornisce un'implementazione dei metodi o delle proprietà astratti.It is an error to use the abstract modifier with a sealed class, because an abstract class must be inherited by a class that provides an implementation of the abstract methods or properties.

Quando applicato a un metodo o a una proprietà, il modificatore sealed deve sempre essere usato con override.When applied to a method or property, the sealed modifier must always be used with override.

Poiché gli struct sono sealed in modo implicito, non possono essere ereditati.Because structs are implicitly sealed, they cannot be inherited.

Per altre informazioni, vedere Ereditarietà.For more information, see Inheritance.

Per altri esempi, vedere Classi e membri delle classi astratte e sealed.For more examples, see Abstract and Sealed Classes and Class Members.

EsempioExample

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 ereditare dalla classe sealed tramite l'istruzione seguente:In the previous example, you might try to inherit from the sealed class by using the following statement:

class MyDerivedC: SealedClass {} // Error

Il risultato è un messaggio di errore:The result is an error message:

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

OsservazioniRemarks

Per determinare se bloccare una classe, proprietà o metodo, è consigliabile in genere considerare i due punti seguenti:To determine whether to seal a class, method, or property, you should generally consider the following two points:

  • I potenziali vantaggi di cui le classi derivate possono usufruire grazie alla possibilità di personalizzare la classe.The potential benefits that deriving classes might gain through the ability to customize your class.

  • La possibilità che le classi derivate possono modificare le classi in uso in modo tale che non funzionino più correttamente o come previsto.The potential that deriving classes could modify your classes in such a way that they would no longer work correctly or as expected.

Specifiche del linguaggio C#C# language specification

Per altre informazioni, vedere la specifica del linguaggio C#.For more information, see the C# Language Specification. La specifica del linguaggio costituisce il riferimento ufficiale principale per la sintassi e l'uso di C#.The language specification is the definitive source for C# syntax and usage.

Vedere ancheSee also