Udostępnij za pośrednictwem


Używanie konstruktorów (przewodnik programowania w języku C#)

Gdy instancja klasy lub struktury jest tworzona, środowisko uruchomieniowe wywołuje konstruktor. Konstruktory mają taką samą nazwę jak klasa lub struktura i zwykle inicjują składowe danych nowego obiektu.

W poniższym przykładzie klasa o nazwie Taxi jest definiowana przy użyciu prostego konstruktora. Ta klasa jest następnie tworzona za pomocą operatora new. Środowisko uruchomieniowe wywołuje konstruktor Taxi natychmiast po przydzieleniu pamięci dla nowego obiektu.

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);
    }
}

Konstruktor, który nie przyjmuje parametrów, jest nazywany konstruktorem bez parametrów . Środowisko uruchomieniowe wywołuje konstruktor bez parametrów, gdy obiekt jest tworzony przy użyciu operatora new i nie podano argumentów dla new. Język C# 12 wprowadził konstruktorów podstawowych. Podstawowy konstruktor określa parametry, które należy podać, aby zainicjować nowy obiekt. Aby uzyskać więcej informacji, zobacz Instance Constructors.

Chyba że klasa jest statyczna, klasa bez konstruktorów otrzymuje publiczny konstruktor bez parametrów przez kompilator języka C# w celu umożliwienia instancjonowania klasy. Aby uzyskać więcej informacji, zobacz Statyczne klasy i składowe klas statycznych.

Można zapobiec utworzeniu instancji klasy, tworząc prywatny konstruktor w następujący sposób:

class NLog
{
    // Private Constructor:
    private NLog() { }

    public static double e = Math.E;  //2.71828...
}

Aby uzyskać więcej informacji, zobacz Private Constructors.

Konstruktory dla typów struktury przypominają konstruktory klas. Po utworzeniu instancji typu struktury z użyciem new, środowisko uruchomieniowe wywołuje konstruktor. Gdy struct jest ustawione na wartość default, środowisko uruchomieniowe inicjuje całą pamięć w strukturze na 0. W przypadku deklarowania jakichkolwiek inicjatorów pól w typie struct należy podać konstruktor bez parametrów. Aby uzyskać więcej informacji, zobacz sekcję inicjowania struktury i wartości domyślne artykułu Typy struktury.

Poniższy kod używa konstruktora bez parametrów dla Int32, dzięki czemu masz pewność, że liczba całkowita jest inicjowana:

int i = new int();
Console.WriteLine(i);

Poniższy kod powoduje jednak błąd kompilatora, ponieważ nie używa new, a ponieważ próbuje użyć obiektu, który nie został zainicjowany:

int i;
Console.WriteLine(i);

Alternatywnie niektóre typy struct (w tym wszystkie wbudowane typy liczbowe) mogą być inicjowane lub przypisywane, a następnie używane w poniższym przykładzie:

int a = 44;  // Initialize the value type...
int b;
b = 33;      // Or assign it before using it.
Console.WriteLine("{0}, {1}", a, b);

Zarówno klasy, jak i struktury mogą definiować konstruktory, które przyjmują parametry, w tym konstruktory główne. Konstruktory, które przyjmują parametry, muszą być wywoływane za pomocą instrukcji new lub instrukcji base. Klasy i struktury mogą również definiować wiele konstruktorów i żadna z nich nie musi definiować konstruktora bez parametrów. Na przykład:

public class Employee
{
    public int Salary;

    public Employee() { }

    public Employee(int annualSalary) => Salary = annualSalary;

    public Employee(int weeklySalary, int numberOfWeeks) => Salary = weeklySalary * numberOfWeeks;
}

Tę klasę można utworzyć przy użyciu jednej z następujących instrukcji:

Employee e1 = new Employee(30000);
Employee e2 = new Employee(500, 52);

Konstruktor może użyć słowa kluczowego base do wywołania konstruktora klasy bazowej. Na przykład:

public class Manager : Employee
{
    public Manager(int annualSalary)
        : base(annualSalary)
    {
        //Add further instructions here.
    }
}

W tym przykładzie konstruktor klasy bazowej jest wywoływany przed wykonaniem bloku konstruktora. Słowo kluczowe base może być używane z parametrami lub bez tych parametrów. Wszystkie parametry konstruktora mogą służyć jako parametry do base, lub w ramach wyrażenia. Aby uzyskać więcej informacji, zobacz base.

W klasie pochodnej, jeśli konstruktor klasy bazowej nie jest wywoływany jawnie przy użyciu słowa kluczowego base, konstruktor bez parametrów, jeśli istnieje, jest wywoływany niejawnie. Następujące deklaracje konstruktorów są w rzeczywistości takie same:

public Manager(int initialData)
{
    //Add further instructions here.
}
public Manager(int initialData)
    : base()
{
    //Add further instructions here.
}

Jeśli klasa bazowa nie oferuje konstruktora bez parametrów, klasa pochodna musi wykonać jawne wywołanie konstruktora podstawowego przy użyciu base.

Konstruktor może wywołać inny konstruktor w tym samym obiekcie przy użyciu słowa kluczowego this. Podobnie jak base, this mogą być używane z parametrami lub bez parametrów, a wszystkie parametry w konstruktorze są dostępne jako parametry do thislub w ramach wyrażenia. Na przykład drugi konstruktor w poprzednim przykładzie można przepisać przy użyciu this:

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

Użycie słowa kluczowego this w poprzednim przykładzie powoduje wywołanie następującego konstruktora:

public Employee(int annualSalary) => Salary = annualSalary;

Konstruktory mogą być oznaczone jako public, private, protected, wewnętrzne, chronione wewnętrzne lub private protected. Te modyfikatory dostępu definiują, w jaki sposób użytkownicy klasy mogą konstruować klasę. Aby uzyskać więcej informacji, zobacz modyfikatory dostępu.

Konstruktor można zadeklarować jako statyczny przy użyciu słowa kluczowego static. Konstruktory statyczne są wywoływane automatycznie przed uzyskaniem dostępu do wszystkich pól statycznych i są używane do inicjowania statycznych składowych klas. Aby uzyskać więcej informacji, zobacz Static Constructors.

Specyfikacja języka C#

Aby uzyskać więcej informacji, zobacz konstruktory wystąpienia i Konstruktory statyczne wspecyfikacji języka C# . Specyfikacja języka jest ostatecznym źródłem składni i użycia języka C#.

Zobacz też