Основные конструкторы классов
Объявляйте параметры конструктора в заголовке типа.
«Основные конструкторы классов» — бесплатный урок C# Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C# Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C# Academy содержит 4 уроков всего.
Что такое первичный конструктор
Первичный конструктор позволяет объявлять параметры конструктора непосредственно в заголовке класса, например class Point(int x, int y). Эти параметры доступны во всей области действия тела класса.
using System;
class Point(int x, int y) {
public int X => x;
public int Y => y;
}
var p = new Point(3, 4);
Console.WriteLine(p.X + "," + p.Y); // 3,4Больше никакого шаблонного кода
До появления первичных конструкторов приходилось писать тело конструктора только для переноса параметров в поля. Теперь параметры объявляются в заголовке, и к ним можно обращаться напрямую.
using System;
class Greeter(string name) {
public string Greet() => "Hello, " + name + "!";
}
Console.WriteLine(new Greeter("Ada").Greet()); // Hello, Ada!Параметры доступны во всей области действия
Параметры первичного конструктора можно использовать в инициализаторах свойств, телах методов и инициализаторах полей в любой части класса.
using System;
class Circle(double radius) {
public double Area => Math.PI * radius * radius;
public double Circumference => 2 * Math.PI * radius;
}
var c = new Circle(2);
Console.WriteLine(Math.Round(c.Area, 2)); // 12.57Инициализация полей и свойств
Параметр первичного конструктора можно использовать для инициализации поля или свойства в момент объявления.
using System;
class Account(decimal initial) {
public decimal Balance { get; private set; } = initial;
public void Deposit(decimal amount) => Balance += amount;
}
var a = new Account(100m);
a.Deposit(50m);
Console.WriteLine(a.Balance); // 150Проверка в заголовке
Параметры первичного конструктора можно проверять непосредственно при присваивании полю, используя выражения с выбрасыванием исключений.
using System;
class Person(string name) {
public string Name { get; } =
string.IsNullOrWhiteSpace(name)
? throw new ArgumentException("name required")
: name;
}
Console.WriteLine(new Person("Lin").Name); // LinДобавление дополнительных конструкторов
В классе с первичным конструктором по-прежнему можно объявлять дополнительные конструкторы, но они должны вызывать первичный конструктор через : this(...).
using System;
class Box(int width, int height) {
public int Width => width;
public int Height => height;
public Box(int size) : this(size, size) { }
}
var sq = new Box(5);
Console.WriteLine(sq.Width + "x" + sq.Height); // 5x5Тела первичных конструкторов
У первичных конструкторов нет собственного тела. Логика, которая должна выполняться при создании, размещается в инициализаторах полей или в обычном конструкторе, связанном с первичным.
using System;
class Logger(string prefix) {
private readonly string tag = "[" + prefix + "]";
public void Log(string msg) => Console.WriteLine(tag + " " + msg);
}
new Logger("INFO").Log("started"); // [INFO] startedСвойства не становятся общедоступными автоматически
В отличие от записей, первичный конструктор обычного класса не создаёт общедоступные свойства. Параметры доступны только внутри класса, если Вы не предоставите к ним доступ самостоятельно.
using System;
class Temp(double celsius) {
// celsius is NOT a public property here
public double Fahrenheit => celsius * 9 / 5 + 32;
}
Console.WriteLine(new Temp(100).Fahrenheit); // 212Захваченные параметры становятся полями
Если параметр первичного конструктора используется в методе, а не только в инициализаторе, компилятор сохраняет его в скрытом поле, чтобы он оставался доступным после создания объекта.
using System;
class Counter(int start) {
private int value = start;
public int Next() => value++;
}
var c = new Counter(10);
Console.WriteLine(c.Next()); // 10
Console.WriteLine(c.Next()); // 11Более чистое внедрение зависимостей
Первичные конструкторы популярны при использовании DI: объявите службы в заголовке и используйте их в методах без ручного присваивания полей.
using System;
interface IClock { string Now(); }
class FakeClock : IClock { public string Now() => "12:00"; }
class Service(IClock clock) {
public string Report() => "Time is " + clock.Now();
}
Console.WriteLine(new Service(new FakeClock()).Report()); // Time is 12:00Объединение всех возможностей
Этот класс использует первичный конструктор для своих зависимостей и предоставляет вычисляемое свойство без явно заданного тела конструктора.
using System;
class Rectangle(double w, double h) {
public double Area => w * h;
public double Perimeter => 2 * (w + h);
}
var r = new Rectangle(3, 4);
Console.WriteLine(r.Area + " " + r.Perimeter); // 12 14Быстрая проверка
Проверьте, насколько хорошо Вы поняли первичные конструкторы в классах.
Итоги
Вы изучили первичные конструкторы в классах.
class C(int x)объявляет параметры конструктора в заголовке.- Параметры доступны во всём теле класса.
- Дополнительные конструкторы вызывают первичный через
: this(...). - В обычном классе они автоматически не становятся общедоступными свойствами.
Часто задаваемые вопросы
Урок «Основные конструкторы классов» бесплатный?
Да — полный текст урока «Основные конструкторы классов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C# Academy, подпишись на CoddyKit PRO. Курс C# Academy содержит 4 уроков всего.
Чему я научусь в уроке «Основные конструкторы классов»?
Объявляйте параметры конструктора в заголовке типа. Ты практикуешь C# Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C# Academy?
Предыдущий опыт не требуется. C# Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Основные конструкторы классов»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C# Academy?
Да. Каждый урок C# Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Основные конструкторы классов
- Использование параметров в членах типа
- Основные конструкторы структур
- Сочетание со свойствами и базовыми типами