Constructori (this, supraîncărcare, static) în C# (.NET)

Constructorul inițializează un obiect creat cu new; poate avea variante, poate apela altă variantă cu : this(...) și există și constructor static.

Sintaxă C#
class Cont { public Cont(string titular) : this(titular, 0) { } public Cont(string titular, decimal sold) { ... } }

Ce face Constructori (this, supraîncărcare, static)

Constructorul este o metodă cu același nume ca clasa și fără tip returnat. Rulează o dată, la new, și pune obiectul într-o stare validă: verifică argumentele și setează câmpurile. Dacă nu scrii niciun constructor, compilatorul generează unul fără parametri; dacă scrii unul cu parametri, cel implicit dispare.

O clasă poate avea mai mulți constructori (supraîncărcare). Ca să nu repeți codul, un constructor îl apelează pe altul cu : this(...), iar în clasele derivate : base(...) apelează constructorul clasei de bază. Constructorul static rulează o singură dată, automat, înainte de prima folosire a clasei.

Pentru clase simple, constructorii primari (C# 12, class Cont(string titular)) și inițializatorii de obiect (new Cont { Titular = "Ana" }) scurtează codul; vezi pagina despre proprietăți și constructori primari.

Exemple

Exemplul 1: Constructori înlănțuiți cu : this(…)

Constructorul scurt trimite valorile implicite celui complet, unde este toată validarea.

var c1 = new Cont("Ana");
var c2 = new Cont("Mihai", 500);
Console.WriteLine(c1);
Console.WriteLine(c2);

try
{
    new Cont("", 10);
}
catch (ArgumentException ex)
{
    Console.WriteLine(ex.ParamName);
}

class Cont
{
    public string Titular { get; }
    public int Sold { get; private set; }

    public Cont(string titular) : this(titular, 0) { }

    public Cont(string titular, int sold)
    {
        ArgumentException.ThrowIfNullOrWhiteSpace(titular);
        Titular = titular;
        Sold = sold;
    }

    public override string ToString() => $"{Titular}: {Sold} lei";
}

Rezultat

Ana: 0 lei
Mihai: 500 lei
titular

Exemplul 2: Ordinea: constructor static, apoi cel de instanță

Console.WriteLine("Start");
var a = new Configurare();
var b = new Configurare();
Console.WriteLine(Configurare.Instante);

class Configurare
{
    public static int Instante;

    static Configurare()
    {
        Console.WriteLine("Constructor static");
    }

    public Configurare()
    {
        Instante++;
        Console.WriteLine($"Instanța {Instante}");
    }
}

Rezultat

Start
Constructor static
Instanța 1
Instanța 2
2

Greșeli frecvente

  • După ce adaugi un constructor cu parametri, new Cont() nu mai compilează. Adaugă explicit un constructor fără parametri dacă ai nevoie de el.
  • Apelarea metodelor virtuale din constructor: în clasa derivată, câmpurile ei nu sunt încă inițializate când rulează constructorul bazei.
  • O excepție aruncată de constructorul static face tipul inutilizabil pentru tot restul programului (TypeInitializationException la fiecare folosire).

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ă.