Constructors gebruiken (C#-programmeerhandleiding)
Wanneer een klasse of struct wordt geïnstantieerd, wordt de constructor aangeroepen. Constructors hebben dezelfde naam als de klasse of struct en initialiseren meestal de gegevensleden van het nieuwe object.
In het volgende voorbeeld wordt een klasse met de naam Taxi
gedefinieerd met behulp van een eenvoudige constructor. Deze klasse wordt vervolgens geïnstantieerd met de nieuwe operator. De Taxi
constructor wordt aangeroepen door de new
operator direct nadat het geheugen is toegewezen voor het nieuwe object.
public class Taxi
{
public bool IsInitialized;
public Taxi()
{
IsInitialized = true;
}
}
class TestTaxi
{
static void Main()
{
Taxi t = new Taxi();
Console.WriteLine(t.IsInitialized);
}
}
Een constructor die geen parameters gebruikt, wordt een parameterloze constructor genoemd. Parameterloze constructors worden aangeroepen wanneer een object wordt geïnstantieerd met behulp van de new
operator en er geen argumenten worden opgegeven voor new
. C# 12 introduceert primaire constructors. Een primaire constructor geeft parameters op die moeten worden opgegeven om een nieuw object te initialiseren. Zie Exemplaarconstructors voor meer informatie.
Tenzij de klasse statisch is, krijgen klassen zonder constructors een openbare parameterloze constructor van de C#-compiler om instantiëring van klassen mogelijk te maken. Zie Statische klassen en statische klasseleden voor meer informatie.
U kunt voorkomen dat een klasse wordt geïnstantieerd door de constructor als volgt privé te maken:
class NLog
{
// Private Constructor:
private NLog() { }
public static double e = Math.E; //2.71828...
}
Zie Private Constructors voor meer informatie.
Constructors voor structtypen lijken op klasseconstructors. Wanneer een struct-type wordt geïnstantieerd, new
wordt er een constructor aangeroepen. Wanneer een struct
waarde is ingesteld op default
de waarde, initialiseert de runtime alle geheugen in de struct op 0. Vóór C# 10 kan geen expliciete parameterloze constructor worden opgenomen omdat structs
er automatisch een wordt geleverd door de compiler. Zie de sectie Struct initialisatie en standaardwaarden van het artikel Structuurtypen voor meer informatie.
De volgende code maakt gebruik van de parameterloze constructor voor Int32, zodat u zeker weet dat het gehele getal wordt geïnitialiseerd:
int i = new int();
Console.WriteLine(i);
De volgende code veroorzaakt echter een compilerfout omdat deze niet wordt gebruikt new
en omdat er wordt geprobeerd een object te gebruiken dat niet is geïnitialiseerd:
int i;
Console.WriteLine(i);
U kunt ook objecten op basis van structs
(inclusief alle ingebouwde numerieke typen) initialiseren of toewijzen en vervolgens gebruiken zoals in het volgende voorbeeld:
int a = 44; // Initialize the value type...
int b;
b = 33; // Or assign it before using it.
Console.WriteLine("{0}, {1}", a, b);
Zowel klassen als structs kunnen constructors definiëren die parameters aannemen, inclusief primaire constructors. Constructors die parameters aannemen, moeten worden aangeroepen via een new
instructie of een basisinstructie . Klassen en structs kunnen ook meerdere constructors definiëren en geen van beide is vereist om een parameterloze constructor te definiëren. Voorbeeld:
public class Employee
{
public int Salary;
public Employee() { }
public Employee(int annualSalary)
{
Salary = annualSalary;
}
public Employee(int weeklySalary, int numberOfWeeks)
{
Salary = weeklySalary * numberOfWeeks;
}
}
Deze klasse kan worden gemaakt met behulp van een van de volgende instructies:
Employee e1 = new Employee(30000);
Employee e2 = new Employee(500, 52);
Een constructor kan het base
trefwoord gebruiken om de constructor van een basisklasse aan te roepen. Voorbeeld:
public class Manager : Employee
{
public Manager(int annualSalary)
: base(annualSalary)
{
//Add further instructions here.
}
}
In dit voorbeeld wordt de constructor voor de basisklasse aangeroepen voordat het blok voor de constructor wordt uitgevoerd. Het base
trefwoord kan worden gebruikt met of zonder parameters. Parameters voor de constructor kunnen worden gebruikt als parameters voor base
of als onderdeel van een expressie. Zie basis voor meer informatie.
Als in een afgeleide klasse een basisklasseconstructor niet expliciet wordt aangeroepen met behulp van het base
trefwoord, wordt de parameterloze constructor, indien aanwezig, impliciet aangeroepen. De volgende constructordeclaraties zijn in feite hetzelfde:
public Manager(int initialData)
{
//Add further instructions here.
}
public Manager(int initialData)
: base()
{
//Add further instructions here.
}
Als een basisklasse geen parameterloze constructor biedt, moet de afgeleide klasse een expliciete aanroep naar een basisconstructor maken met behulp van base
.
Een constructor kan een andere constructor in hetzelfde object aanroepen met behulp van dit trefwoord. Net zoals base
, this
kan worden gebruikt met of zonder parameters, en alle parameters in de constructor zijn beschikbaar als parameters voor this
, of als onderdeel van een expressie. De tweede constructor in het vorige voorbeeld kan bijvoorbeeld opnieuw worden geschreven met behulp van this
:
public Employee(int weeklySalary, int numberOfWeeks)
: this(weeklySalary * numberOfWeeks)
{
}
Het gebruik van het this
trefwoord in het vorige voorbeeld zorgt ervoor dat deze constructor wordt aangeroepen:
public Employee(int annualSalary)
{
Salary = annualSalary;
}
Constructors kunnen worden gemarkeerd als openbaar, privé, beveiligd, intern, beveiligd intern of privé beveiligd. Deze toegangsaanpassingen definiëren hoe gebruikers van de klasse de klasse kunnen samenstellen. Zie Toegangsmodifiers voor meer informatie.
Een constructor kan statisch worden gedeclareerd met behulp van het statische trefwoord. Statische constructors worden automatisch aangeroepen, direct voordat statische velden worden geopend en worden gebruikt om statische klasseleden te initialiseren. Zie Statische constructors voor meer informatie.
C#-taalspecificatie
Zie Exemplaarconstructors en statische constructors in de C#-taalspecificatie voor meer informatie. De taalspecificatie is de definitieve bron voor de C#-syntaxis en het gebruik.