sealed în C# (.NET)

Interzice moștenirea unei clase sau suprascrierea mai departe a unei metode override.

Sintaxă C#
sealed class Factura { }   public sealed override string ToString() => ...;

Ce face sealed

sealed class nu poate fi folosită ca bază: class X : Factura dă eroarea CS0509. E util pentru clase care nu au fost gândite pentru extindere (siguranță, invariante) și ajută compilatorul JIT să apeleze metodele virtuale direct, fără căutare la rulare.

Pe o metodă, sealed se pune doar împreună cu override: clasa curentă înlocuiește metoda bazei, dar clasele derivate din ea nu o mai pot înlocui. Tipurile record pot avea sealed override ToString(), ca derivatele să nu-l genereze din nou.

Multe ghiduri .NET recomandă ca o clasă publică să fie sealed dacă nu are un motiv explicit să fie extinsă; analizorul CA1852 semnalează tipurile interne care nu sunt moștenite nicăieri și pot fi sigilate.

Exemple

Exemplul 1: Metodă sigilată într-o ierarhie

Moneda fixează formatul; Leu nu îl mai poate schimba, dar poate adăuga alte metode.

Suma s = new Leu(250);
Console.WriteLine(s.Formatat());

class Suma(int valoare)
{
    public int Valoare { get; } = valoare;
    public virtual string Formatat() => Valoare.ToString();
}

class Moneda(int valoare, string cod) : Suma(valoare)
{
    public sealed override string Formatat() => $"{Valoare} {cod}";
}

sealed class Leu(int valoare) : Moneda(valoare, "RON")
{
    // public override string Formatat() => ...;  // eroare CS0239: metoda este sealed
}

Rezultat

250 RON

Exemplul 2: Clasă sigilată și verificare la rulare

Type.IsSealed spune dacă un tip este sigilat; string este și el sealed.

Console.WriteLine(typeof(Factura).IsSealed);
Console.WriteLine(typeof(string).IsSealed);
Console.WriteLine(typeof(Exception).IsSealed);

sealed class Factura
{
    public required string Numar { get; init; }
}

Rezultat

True
True
False

Greșeli frecvente

  • sealed pe o metodă fără override nu se compilează (CS0238).
  • static class și sealed nu se combină: o clasă statică este deja sigilată și abstractă.
  • Sigilarea unei clase dintr-o bibliotecă publicată este o schimbare incompatibilă pentru cei care o moșteneau deja.

Comenzi înrudite

  • Moștenire: virtual, override și base: O clasă derivată preia membrii clasei de bază (class B : A); metodele virtual pot fi înlocuite cu override, iar base apelează varianta de bază.
  • abstract (clase și metode abstracte): O clasă abstract nu poate fi instanțiată direct; metodele abstract nu au corp și trebuie implementate de fiecare clasă derivată.
  • Clase și membri static: Membrii static aparțin tipului, nu unui obiect; o static class conține doar membri statici și nu poate fi instanțiată.
Comunitate & Schimb de cunoștințe

Întrebări & Exemple de Cod: sealed

Ai o nelămurire despre utilizarea comenzii sealed sau ai descoperit un truc / fragment de cod util? Distribuie-l cu ceilalți programatori!

💬

Fii primul care pune o întrebare sau distribuie un fragment de cod / prompt!

Nu au fost adăugate încă întrebări sau exemple de cod pentru această pagină. Dacă ai întâlnit o problemă sau ai un snippet util, adaugă-l mai jos pentru a-i ajuta pe ceilalți.

Comunitate Adaugă o întrebare sau distribuie un cod

Moderare & Siguranță:

Pentru a menține calitatea și securitatea informațiilor, fiecare întrebare sau fragment de cod/prompt este analizat (manual sau prin moderare asistată de AI) înainte de publicare.