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 operatorn nya. Konstruktorn Taxi anropas av new-operatorn 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 för 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 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 newanropas 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 newoch eftersom den försöker använda ett objekt som inte har initierats:

int i;
Console.WriteLine(i);

Alternativt kan objekt som baseras 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 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 baseeller 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 this-nyckelordet. Precis som basekan this användas med eller utan parametrar, och alla parametrar i konstruktorn är tillgängliga som parametrar för thiseller 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 konstruktorn anropas:

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

Konstruktorer kan markeras som offentlig, privat, skyddad, intern, intern skyddad eller skyddad privat. 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 statisk. 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# Language Specification. Språkspecifikationen är den slutgiltiga källan för C#-syntax och -användning.

Se även