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