Dela via


Använda konstruktorer (C#-programmeringsguide)

När en klass eller struct instansieras anropas 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 den nya operatorn. Konstruktorn Taxi anropas av operatorn new omedelbart efter att minnet har allokerats för det nya objektet.

public class Taxi
{
    public bool IsInitialized;

    public Taxi()
    {
        IsInitialized = true;
    }
}

class TestTaxi
{
    static void Main()
    {
        Taxi t = new Taxi();
        Console.WriteLine(t.IsInitialized);
    }
}

En konstruktor som inte tar några parametrar kallas för en parameterlös konstruktor. Parameterlösa konstruktorer anropas när ett objekt instansieras med hjälp av operatorn new och inga argument anges till new. C# 12 introducerar 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 statisk får 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 structtyper liknar klasskonstruktorer. När en struct-typ instansieras med newanropas en konstruktor. När en struct är inställd på dess default värde initierar körningen allt minne i structen till 0. Före C# 10 structs kan inte innehålla en explicit parameterlös konstruktor eftersom en tillhandahålls automatiskt av kompilatorn. 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 objekt baserade på structs (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 basuttryck . 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 för baseeller som en del av ett uttryck. Mer information finns i bas.

Om en konstruktor i en härledd klass inte anropas explicit med hjälp av nyckelordet base anropas den parameterlösa konstruktorn, om det finns en, implicit. 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 baseav .

En konstruktor kan anropa en annan konstruktor i samma objekt med hjälp av det här nyckelordet. Som base, this kan 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 :this

public Employee(int weeklySalary, int numberOfWeeks)
    : this(weeklySalary * numberOfWeeks)
{
}

Användningen av nyckelordet this i föregående exempel gör att konstruktorn anropas:

public Employee(int annualSalary)
{
    Salary = annualSalary;
}

Konstruktorer kan markeras som offentliga, privata, skyddade, interna, skyddade interna eller privata skyddade. 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 det statiska nyckelordet. Statiska konstruktorer anropas automatiskt, omedelbart 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#-språkspecifikationen. Språkspecifikationen är den slutgiltiga källan för C#-syntax och -användning.

Se även