Язык программирования C#9 и платформа .NET5
К счастью, язык C# поддерживает использование конструкторов, которые позволяют устанавливать состояние объекта в момент его создания. Конструктор — это специальный метод класса, который неявно вызывается при создании объекта с применением ключевого слова new. Однако в отличие от "нормального" метода конструктор никогда не имеет возвращаемого значения (даже
) и всегда именуется идентично имени класса, объекты которого он конструирует.voidРоль стандартного конструктора
Каждый класс C# снабжается "бесплатным" стандартным конструктором, который в случае необходимости может быть переопределен. По определению стандартный конструктор никогда не принимает аргументов. После размещения нового объекта в памяти стандартный конструктор гарантирует установку всех полей данных в соответствующие стандартные значения (стандартные значения для типов данных C# были описаны в главе 3).
Если вас не устраивают такие стандартные присваивания, тогда можете переопределить стандартный конструктор в соответствии со своими нуждами. В целях иллюстрации модифицируем класс C# следующим образом:
class Car{// 'Состояние' объекта Car.public string petName;public int currSpeed;// Специальный стандартный конструктор.public Car(){petName = "Chuck";currSpeed = 10;...}В данном случае мы заставляем объекты
начинать свое существование под именемCarи со скоростью 10 миль в час. Создать объектChuckсо стандартными значениями можно так:CarConsole.WriteLine("***** Fun with Class Types *****\n");// Вызов стандартного конструктора.Car chuck = new Car();// Выводит строку "Chuck is going 10 MPH."chuck.PrintState();...Определение специальных конструкторов
Обычно помимо стандартного конструктора в классах определяются дополнительные конструкторы. Тем самым пользователю объекта предоставляется простой и согласованный способ инициализации состояния объекта прямо во время его создания. Взгляните на следующее изменение класса
, который теперь поддерживает в совокупности три конструктора:Carclass Car{// 'Состояние' объекта Car.public string petName;public int currSpeed;// Специальный стандартный конструктор.public Car(){petName = "Chuck";currSpeed = 10;}// Здесь currSpeed получает стандартное значение для типа int (0).public Car(string pn){petName = pn;}// Позволяет вызывающему коду установить полное состояние объекта Car.public Car(string pn, int cs){petName = pn;currSpeed = cs;}...}Имейте в виду, что один конструктор отличается от другого (с точки зрения компилятора С#) числом и/или типами аргументов. Вспомните из главы 4, что определение метода с тем же самым именем, но разным количеством или типами аргументов, называется перегрузкой метода. Таким образом, конструктор класса
перегружен, чтобы предложить несколько способов создания объекта во время объявления. В любом случае теперь есть возможность создавать объектыCar, используя любой из его открытых конструкторов. Вот пример:CarConsole.WriteLine("***** Fun with Class Types *****\n");// Создать объект Car по имени Chuck со скоростью 10 миль в час.Car chuck = new Car();chuck.PrintState();// Создать объект Car по имени Mary со скоростью 0 миль в час.Car mary = new Car("Mary");mary.PrintState();// Создать объект Car по имени Daisy со скоростью 75 миль в час.Car daisy = new Car("Daisy", 75);daisy.PrintState();...Конструкторы в виде членов, сжатых до выражений (нововведение в версии 7.0)
В C# 7 появились дополнительные случаи употребления для стиля членов, сжатых до выражений. Теперь такой синтаксис применим к конструкторам, финализаторам, а также к средствам доступа
для свойств и индексаторов. С учетом сказанного предыдущий конструктор можно переписать следующим образом:get/set// Здесь currSpeed получит стандартное// значение для типа int (0).public Car(string pn) => petName = pn;Второй специальный конструктор не может быть преобразован в выражение, т.к. члены, сжатые до выражений, должны быть однострочными методами.
Конструкторы с параметрами out (нововведение в версии 7.3)
Начиная с версии C# 7.3, в конструкторах (а также в рассматриваемых позже инициализаторах полей и свойств) могут использоваться параметры
. В качестве простого примера добавьте в классoutследующий конструктор:Car