Dela via


förseglad (C#-referens)

När du tillämpar modifieraren på sealed en klass förhindrar det att andra klasser ärver från den klassen. I följande exempel ärver klass B från klassen A, men ingen klass kan ärva från klassen B.

class A {}
sealed class B : A {}

Du kan också använda sealed-modifieraren för en metod eller egenskap som åsidosätter en virtuell metod eller egenskap i en basklass. Med den här metoden gör du det möjligt för utvecklare att härleda klasser från din klass samtidigt som de hindras från att åsidosätta specifika virtuella metoder eller egenskaper.

C#-språkreferensen dokumenterar den senaste versionen av C#-språket. Den innehåller även inledande dokumentation för funktioner i offentliga förhandsversioner för den kommande språkversionen.

Dokumentationen identifierar alla funktioner som först introducerades i de tre senaste versionerna av språket eller i aktuella offentliga förhandsversioner.

Tips/Råd

Information om när en funktion först introducerades i C# finns i artikeln om språkversionshistoriken för C#.

I följande exempel Z ärver från Y men Z kan inte åsidosätta den virtuella funktion F som deklareras i X och förseglas i 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"); }
}

När du definierar nya metoder eller egenskaper i en klass kan du förhindra deriverade klasser från att åsidosätta dem genom att inte deklarera dem som virtuella. När du åsidosätter en virtual medlem som deklarerats i en bastyp kan du förhindra att härledda typer åsidosätter den med hjälp av nyckelordet sealed enligt följande exempel:

public sealed override string ToString() => Value;

Det är ett fel att använda den abstrakta modifieraren med en förseglad klass, eftersom en abstrakt klass måste ärvas av en klass som tillhandahåller en implementering av abstrakta metoder eller egenskaper.

När du tillämpar modifieraren på sealed en metod eller egenskap ska du alltid använda den med åsidosättning.

Eftersom structs är implicit förseglade kan du inte ärva från dem.

Mer information finns i Arv.

Fler exempel finns i abstrakta och förseglade klasser och klassmedlemmar.

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

I föregående exempel kan du försöka ärva från den förseglade klassen med hjälp av följande instruktion:

class MyDerivedC: SealedClass {} // Error

Resultatet är ett felmeddelande:

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

För att avgöra om du vill försegla en klass, metod eller egenskap bör du vanligtvis överväga följande två punkter:

  • De potentiella fördelar som härledda klasser kan få genom möjligheten att skräddarsy en klass.
  • Risken för att härleda klasser kan ändra dina klasser på ett sådant sätt att de inte längre fungerar korrekt eller som förväntat.

Språkspecifikation för C#

Mer information finns i C#-språkspecifikationen. Språkspecifikationen är den slutgiltiga källan för C#-syntax och -användning.

Se även