Använda konstruktorer (programmeringsguide för C#)
När en -klass eller -struktur instansieras anropar körtiden konstruktorn. Konstruktorer har samma namn som klassen eller structen, och de initierar vanligtvis datamedlemmarna i det nya objektet.
I följande exempel definieras en klass med namnet Taxi
med hjälp av en enkel konstruktor. Den här klassen instansieras sedan med operatorn new
. Körningen anropar Taxi
konstruktorn omedelbart efter att minnet har allokerats för det nya objektet.
public class Taxi
{
private string taxiTag;
public Taxi(string tag) => taxiTag = tag;
public override string ToString() => $"Taxi: {taxiTag}";
}
class TestTaxi
{
static void Main()
{
Taxi t = new Taxi("Tag1345");
Console.WriteLine(t);
}
}
En konstruktor som inte tar några parametrar kallas för en parameterlös konstruktor. Körningen anropar den parameterlösa konstruktorn när ett objekt instansieras med operatorn new
och inga argument anges för new
. C# 12 introducerade primära konstruktorer. En primär konstruktor anger parametrar som måste anges för att initiera ett nytt objekt. Mer information finns i Instanskonstruktorer.
Om inte klassen är statiskges klasser utan konstruktorer en offentlig parameterlös konstruktor av C#-kompilatorn för att aktivera klassinstansiering. Mer information finns i statiska klasser och statiska klassmedlemmar.
Du kan förhindra att en klass instansieras genom att göra konstruktorn privat enligt följande:
class NLog
{
// Private Constructor:
private NLog() { }
public static double e = Math.E; //2.71828...
}
Mer information finns i Privata konstruktorer.
Konstruktorer för struct typer liknar klasskonstruktorer. När en struct-typ instansieras med new
anropar körningen en konstruktor. När en struct
är inställd på värdet default
initierar körningstiden allt minne i structen till 0. Om du deklarerar några fältinitierare i en struct
typ måste du ange en parameterlös konstruktor. Mer information finns i avsnittet Struct-initiering och standardvärden i artikeln Strukturtyper.
Följande kod använder den parameterlösa konstruktorn för Int32, så att du är säker på att heltalet initieras:
int i = new int();
Console.WriteLine(i);
Följande kod orsakar dock ett kompilatorfel eftersom den inte använder new
, och eftersom den försöker använda ett objekt som inte har initierats:
int i;
Console.WriteLine(i);
Alternativt kan vissa struct
typer (inklusive alla inbyggda numeriska typer) initieras eller tilldelas och sedan användas som i följande exempel:
int a = 44; // Initialize the value type...
int b;
b = 33; // Or assign it before using it.
Console.WriteLine("{0}, {1}", a, b);
Både klasser och structs kan definiera konstruktorer som tar parametrar, inklusive primära konstruktorer. Konstruktorer som tar parametrar måste anropas via en new
-instruktion eller en grundläggande-instruktion. Klasser och structs kan också definiera flera konstruktorer, och ingen av dem krävs för att definiera en parameterlös konstruktor. Till exempel:
public class Employee
{
public int Salary;
public Employee() { }
public Employee(int annualSalary) => Salary = annualSalary;
public Employee(int weeklySalary, int numberOfWeeks) => Salary = weeklySalary * numberOfWeeks;
}
Den här klassen kan skapas med någon av följande instruktioner:
Employee e1 = new Employee(30000);
Employee e2 = new Employee(500, 52);
En konstruktor kan använda nyckelordet base
för att anropa konstruktorn för en basklass. Till exempel:
public class Manager : Employee
{
public Manager(int annualSalary)
: base(annualSalary)
{
//Add further instructions here.
}
}
I det här exemplet anropas konstruktorn för basklassen innan blocket för konstruktorn körs. Nyckelordet base
kan användas med eller utan parametrar. Alla parametrar till konstruktorn kan användas som parametrar till base
eller som del av ett uttryck. Mer information finns i bas.
Om en konstruktor för basklass inte anropas explicit i en härledd klass med hjälp av nyckelordet base
anropas den parameterlösa konstruktorn implicit om det finns en. Följande konstruktordeklarationer är i praktiken desamma:
public Manager(int initialData)
{
//Add further instructions here.
}
public Manager(int initialData)
: base()
{
//Add further instructions here.
}
Om en basklass inte erbjuder en parameterlös konstruktor måste den härledda klassen göra ett explicit anrop till en baskonstruktor med hjälp av base
.
En konstruktor kan anropa en annan konstruktor i samma objekt med hjälp av nyckelordet this
. Precis som base
kan this
användas med eller utan parametrar, och alla parametrar i konstruktorn är tillgängliga som parametrar för this
eller som en del av ett uttryck. Till exempel kan den andra konstruktorn i föregående exempel skrivas om med hjälp av this
:
public Employee(int weeklySalary, int numberOfWeeks)
: this(weeklySalary * numberOfWeeks)
{
}
Användningen av nyckelordet this
i föregående exempel gör att följande konstruktor anropas:
public Employee(int annualSalary) => Salary = annualSalary;
Konstruktorer kan markeras som public
, private
, protected
, internt, skyddad intern eller private protected
. Dessa åtkomstmodifierare definierar hur användare av klassen kan konstruera klassen. Mer information finns i Åtkomstmodifierare.
En konstruktor kan deklareras som statisk med hjälp av nyckelordet static
. Statiska konstruktorer anropas automatiskt innan statiska fält används och används för att initiera statiska klassmedlemmar. Mer information finns i statiska konstruktorer.
Språkspecifikation för C#
Mer information finns i Instanskonstruktorer och Statiska konstruktorer i C# Language Specification. Språkspecifikationen är den slutgiltiga källan för C#-syntax och -användning.