Конструкторы в C#: виды, примеры и продвинутые паттерны
Конструкторы в C#
Узнайте, как конструкторы инициализируют объекты в C#, охватывая все виды конструкторов, паттерны и лучшие практики.
В C# конструктор — специальный метод, автоматически вызываемый при создании нового экземпляра класса. В отличие от обычных методов, конструкторы:
- имеют то же имя, что и класс
- не возвращают значения
Создание конструктора в C#
Определите конструктор внутри класса, используя имя класса:
class Car {
// конструктор
Car() {
// код инициализации
}
}
Здесь Car() — конструктор. Вызывается с ключевым словом new:
new Car();
Например:
Car car1 = new Car();
См. также: C# Class and Objects.
Виды конструкторов
Основные категории:
- Безпараметрический (конструктор по умолчанию)
- Параметрический конструктор
- Конструктор копирования
- Приватный конструктор
- Статический конструктор
1. Безпараметрический конструктор
Конструктор без параметров называется безпараметрическим или конструктором по умолчанию. Пример:
using System;
namespace ConstructorDemo {
class Car {
// безпараметрический конструктор
Car() {
Console.WriteLine("Car Constructor");
}
static void Main(string[] args) {
new Car();
Console.ReadLine();
}
}
}
Вывод
Car Constructor
2. Параметрический конструктор
Конструкторы могут принимать аргументы для инициализации полей экземпляра:
using System;
namespace ConstructorDemo {
class Car {
string brand;
int price;
// параметрический конструктор
Car(string theBrand, int thePrice) {
brand = theBrand;
price = thePrice;
}
static void Main(string[] args) {
Car car1 = new Car("Bugatti", 50000);
Console.WriteLine("Brand: " + car1.brand);
Console.WriteLine("Price: " + car1.price);
Console.ReadLine();
}
}
}
Вывод
Brand: Bugatti Price: 50000
3. Конструктор по умолчанию (неявный)
Если вы не объявляете конструктор, компилятор предоставляет неявный безпараметрический конструктор, инициализирующий поля значениями по умолчанию. Пример:
using System;
namespace ConstructorDemo {
class Program {
int a;
static void Main(string[] args) {
Program p1 = new Program();
Console.WriteLine("Default value of a: " + p1.a);
Console.ReadLine();
}
}
}
Вывод
Default value of a: 0
Числовые поля по умолчанию 0, строки и объекты — null.
4. Конструктор копирования
Конструктор копирования создает новый экземпляр, копируя состояние другого объекта:
using System;
namespace ConstructorDemo {
class Car {
string brand;
// основной конструктор
Car(string theBrand) {
brand = theBrand;
}
// конструктор копирования
Car(Car c1) {
brand = c1.brand;
}
static void Main(string[] args) {
Car car1 = new Car("Bugatti");
Console.WriteLine("Brand of car1: " + car1.brand);
Car car2 = new Car(car1);
Console.WriteLine("Brand of car2: " + car2.brand);
Console.ReadLine();
}
}
}
Вывод
Brand of car1: Bugatti Brand of car2: Bugatti
5. Приватный конструктор
Пометка конструктора private запрещает внешнее создание экземпляров, полезно для синглтонов или утилитарных классов.
Пример
using System;
namespace ConstructorDemo {
class Car {
private Car() {
Console.WriteLine("Private Constructor");
}
}
class CarDrive {
static void Main(string[] args) {
// Car car1 = new Car(); // ошибка компиляции
Console.ReadLine();
}
}
}
Ошибка:
error CS0122: 'Car.Car()' is inaccessible due to its protection level
Примечание: Когда конструктор приватный, все члены класса должны быть статическими для доступа через имя класса.
6. Статический конструктор
Статический конструктор выполняется один раз на тип, перед доступом к любому статическому или экземплярному члену. Не может быть вызван напрямую, не принимает параметров и не имеет модификаторов доступа.
using System;
namespace ConstructorDemo {
class Car {
static Car() {
Console.WriteLine("Static Constructor");
}
Car() {
Console.WriteLine("Default Constructor");
}
static void Main(string[] args) {
Car car1 = new Car();
Car car2 = new Car();
Console.ReadLine();
}
}
}
Вывод
Static Constructor Default Constructor Default Constructor
Примечание: Только один статический конструктор на класс; не может иметь параметров или модификаторов доступа.
Перегрузка конструкторов в C#
Определите несколько конструкторов с разными списками параметров для гибкого создания объектов. Пример:
using System;
namespace ConstructorOverloadDemo {
class Car {
Car() {
Console.WriteLine("Car constructor");
}
Car(string brand) {
Console.WriteLine("Car constructor with one parameter");
Console.WriteLine("Brand: " + brand);
}
static void Main(string[] args) {
Car car = new Car();
Console.WriteLine();
Car car2 = new Car("Bugatti");
Console.ReadLine();
}
}
}
Вывод
Car constructor Car constructor with one parameter Brand: Bugatti
Компилятор выбирает подходящий конструктор по количеству и типам аргументов. Подробнее см. C# Constructor Overloading.
Язык C
- Вложенные классы в C#: определение, использование и наследование
- Освоение перегрузки конструкторов в C#
- Понимание конструкторов в C++: конструкторы по умолчанию, параметризованные и копирования
- Освоение конструкторов Java: типы, использование и практические примеры
- Конструкторы в Java Enums: объяснение с практическим примером
- Охлаждающая жидкость двигателя: назначение, виды и обслуживание
- Конструкторы в Java: инициализация и лучшие практики
- Как количество цилиндров формирует характеристики современных двигателей
- Расширенная гарантия автомобиля: как она защищает и экономит деньги
- Частые причины течи масляного фильтра и как их устранить