0Pricing
C# Academy · Урок

Основные конструкторы классов

Объявляйте параметры конструктора в заголовке типа.

«Основные конструкторы классов» — бесплатный урок 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 — локальная установка не требуется.

Все уроки этого курса

  1. Основные конструкторы классов
  2. Использование параметров в членах типа
  3. Основные конструкторы структур
  4. Сочетание со свойствами и базовыми типами
← Назад к C# Academy