Udostępnij za pośrednictwem


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

Po utworzeniu wystąpienia klasy lub struktury jego konstruktor jest wywoływany. 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 tworzone za pomocą nowego operatora. Konstruktor Taxi jest wywoływany przez new operatora natychmiast po przydzieleniu pamięci dla nowego obiektu.

public class Taxi
{
    public bool IsInitialized;

    public Taxi()
    {
        IsInitialized = true;
    }
}

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

Konstruktor, który nie przyjmuje żadnych parametrów, jest nazywany konstruktorem bez parametrów. Konstruktory bez parametrów są wywoływane przy każdym utworzeniu wystąpienia obiektu przy użyciu new operatora i nie podano argumentów .new Język C# 12 wprowadza konstruktory podstawowe. Podstawowy konstruktor określa parametry, które należy podać, aby zainicjować nowy obiekt. Aby uzyskać więcej informacji, zobacz Konstruktory wystąpień.

Jeśli klasa nie jest statyczna, klasy bez konstruktorów otrzymują publiczny konstruktor bez parametrów przez kompilator języka C#, aby umożliwić tworzenie wystąpienia klas. Aby uzyskać więcej informacji, zobacz Klasy statyczne i składowe klas statycznych.

Klasę można zapobiec utworzeniu wystąpienia przez utworzenie prywatnego konstruktora 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 Konstruktory prywatne.

Konstruktory dla typów struktur przypominają konstruktory klas. Po utworzeniu wystąpienia typu struktury za pomocą newmetody wywoływany jest konstruktor. Gdy element struct jest ustawiony na jego default wartość, środowisko uruchomieniowe inicjuje całą pamięć w strukturę na 0. Przed C# 10 nie może zawierać jawnego konstruktora bez parametrów, structs ponieważ jest on dostarczany automatycznie przez kompilator. Aby uzyskać więcej informacji, zobacz sekcję Inicjowanie struktury i wartości domyślne w artykule Typy struktury.

Poniższy kod używa konstruktora bez parametrów dla Int32klasy , 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 newelementu , a ponieważ próbuje użyć obiektu, który nie został zainicjowany:

int i;
Console.WriteLine(i);

Alternatywnie obiekty oparte na (łącznie ze structs wszystkimi wbudowanymi typami liczbowymi) 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 podstawowe. Konstruktory, które przyjmują parametry, muszą być wywoływane za pomocą new instrukcji lub instrukcji podstawowej . Klasy i struktury mogą również definiować wiele konstruktorów i nie jest wymagane do zdefiniowania 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ć base słowa kluczowego , aby wywołać konstruktor 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 base kluczowe może być używane z parametrami lub bez tych parametrów. Dowolne 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 polecenia base.

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

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

Użycie słowa kluczowego this w poprzednim przykładzie powoduje wywołanie tego konstruktora:

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

Konstruktory mogą być oznaczone jako publiczne, prywatne, chronione, wewnętrzne, chronione wewnętrzne lub prywatne. 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 statycznego słowa kluczowego. Konstruktory statyczne są wywoływane automatycznie, bezpośrednio przed uzyskaniem dostępu do wszystkich pól statycznych i są używane do inicjowania składowych klas statycznych. Aby uzyskać więcej informacji, zobacz Konstruktory statyczne.

Specyfikacja języka C#

Aby uzyskać więcej informacji, zobacz Konstruktory wystąpień i Konstruktory statyczne w specyfikacji języka C#. Specyfikacja języka jest ostatecznym źródłem informacji o składni i użyciu języka C#.

Zobacz też