Konstruktory (przewodnik programowania w języku C#)
Konstruktor jest metodą wywoływaną przez środowisko uruchomieniowe, gdy tworzone jest wystąpienie klasy lub struktury. Klasa lub struktura może mieć wiele konstruktorów, które przyjmują różne argumenty. Konstruktory umożliwiają zapewnienie, że wystąpienia typu są prawidłowe w momencie tworzenia. Aby uzyskać więcej informacji i przykładów, zobacz Konstruktory wystąpień i Korzystanie z konstruktorów.
Istnieje kilka czynności, które są częścią inicjowania nowego wystąpienia. Następujące akcje mają miejsce w następującej kolejności:
- Pola wystąpienia są ustawione na 0. Ta inicjalizacja jest zwykle wykonywana przez środowisko uruchomieniowe.
- inicjatory pól uruchamiają. Inicjalizatory pól w najbardziej pochodnym typie są uruchamiane.
- inicjalizatory pól typu bazowego są uruchamiane. Inicjalizatory pól, rozpoczynające od bezpośredniej klasy bazowej, poprzez każdy typ bazowy do System.Object.
- konstruktory wystąpienia podstawowego uruchamiają. Wszystkie konstruktory wystąpień, począwszy od Object.Object, poprzez każdą klasę bazową aż do bezpośredniej klasy bazowej.
- Konstruktor obiektu uruchamia. Konstruktor wystąpienia dla typu jest uruchamiany.
- inicjatory obiektów uruchamiają. Jeśli wyrażenie zawiera jakiekolwiek inicjatory obiektów, są uruchamiane po uruchomieniu konstruktora wystąpienia. Inicjatory obiektów są uruchamiane w kolejności tekstowej.
Wymienione akcje mają miejsce podczas tworzenia wystąpienia przy użyciu operatora new
. Jeśli nowe wystąpienie struct
jest ustawione na wartość default
, wszystkie pola wystąpienia są ustawione na 0. Elementy tablicy są ustawiane na wartość domyślną 0 lub null
podczas tworzenia tablicy.
Konstruktor statyczny , jeśli istnieje, jest wykonywany przed jakimikolwiek działaniami konstruktorów instancji dla dowolnego wystąpienia typu. Konstruktor statyczny jest uruchamiany co najwyżej raz.
Składnia konstruktora
Konstruktor jest metodą o tej samej nazwie co jej typ. Podpis metody może zawierać opcjonalny modyfikator dostępu, nazwę metody i listę parametrów; nie zawiera typu zwracanego. W poniższym przykładzie przedstawiono konstruktor klasy o nazwie Person
.
public class Person
{
private string last;
private string first;
public Person(string lastName, string firstName)
{
last = lastName;
first = firstName;
}
// Remaining implementation of Person class.
}
Jeśli konstruktor można zaimplementować jako pojedynczą instrukcję, można użyć składowej treści wyrażenia. W poniższym przykładzie zdefiniowano klasę Location
, której konstruktor ma jeden parametr ciągu o nazwie name. Definicja treści wyrażenia przypisuje argument do pola locationName
.
public class Location
{
private string locationName;
public Location(string name) => Name = name;
public string Name
{
get => locationName;
set => locationName = value;
}
}
Jeśli typ wymaga parametru do utworzenia wystąpienia, możesz użyć podstawowego konstruktora, aby wskazać, że do utworzenia wystąpienia typu wymagany jest co najmniej jeden parametr, jak pokazano w poniższym przykładzie:
public class LabelledContainer<T>(string label)
{
public string Label { get; } = label;
public required T Contents
{
get;
init;
}
}
Konstruktory statyczne
W poprzednich przykładach pokazano konstruktory instancji, które inicjują nowy obiekt. Klasa lub struktura może również zadeklarować konstruktor statyczny, który inicjuje statycznych członków typu. Konstruktory statyczne są bez parametrów. Jeśli nie podasz konstruktora statycznego do inicjowania pól statycznych, kompilator języka C# inicjuje pola statyczne do ich wartości domyślnej, jak pokazano w artykule Domyślne wartości typów języka C#.
W poniższym przykładzie użyto konstruktora statycznego do zainicjowania pola statycznego.
public class Adult : Person
{
private static int minimumAge;
public Adult(string lastName, string firstName) : base(lastName, firstName)
{ }
static Adult() => minimumAge = 18;
// Remaining implementation of Adult class.
}
Można również zdefiniować konstruktor statyczny z definicją treści wyrażenia, jak pokazano w poniższym przykładzie.
public class Child : Person
{
private static int maximumAge;
public Child(string lastName, string firstName) : base(lastName, firstName)
{ }
static Child() => maximumAge = 18;
// Remaining implementation of Child class.
}
Aby uzyskać więcej informacji i przykładów, zobacz Static Constructors.