0Pricing
C# Academy · Урок

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

Применяйте основные конструкторы к типам значений.

«Основные конструкторы структур» — бесплатный урок C# Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C# Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C# Academy содержит 4 уроков всего.

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

Структуры тоже поддерживают основные конструкторы: struct Point(int x, int y). Они работают почти так же, как в классах, объявляя параметры в заголовке.

using System;

struct 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;

struct Vec(int x, int y) {
    public int X => x;
    public int Y => y;
}

var zero = new Vec(); // default: x=0, y=0
Console.WriteLine(zero.X + "," + zero.Y); // 0,0

Предоставление параметров через свойства

Как и в классах, параметры основного конструктора структуры автоматически не становятся общедоступными свойствами: предоставьте их явно.

using System;

struct Size(int w, int h) {
    public int Width { get; } = w;
    public int Height { get; } = h;
}

var s = new Size(10, 20);
Console.WriteLine(s.Width * s.Height); // 200

Вычисляемые члены

Основные конструкторы структур хорошо сочетаются с вычисляемыми членами, записанными в виде выражений.

using System;

struct Complex(double re, double im) {
    public double Magnitude => Math.Sqrt(re * re + im * im);
}

Console.WriteLine(new Complex(3, 4).Magnitude); // 5

Неизменяемые структуры

readonly struct с основным конструктором гарантирует неизменяемость. Ни один член не должен изменять состояние, поэтому свойства только для чтения подходят здесь идеально.

using System;

readonly struct Money(decimal amount, string currency) {
    public decimal Amount { get; } = amount;
    public string Currency { get; } = currency;
    public string Display => Amount.ToString("0.00") + " " + Currency;
}

Console.WriteLine(new Money(5m, "USD").Display); // 5.00 USD

Цепочка вызовов с основным конструктором

Дополнительные конструкторы структуры должны вызывать основной с помощью : this(...), как и в классах.

using System;

struct Square(int side) {
    public int Side => side;
    public int Area => side * side;
    public Square() : this(1) { } // explicit default side
}

Console.WriteLine(new Square(4).Area); // 16

Конструктор по умолчанию и основной конструктор

Обратите внимание: new Square() может использовать как неявную инициализацию нулевыми значениями, так и объявленный Вами конструктор без параметров. Если Вы определите конструктор с цепочкой вызовов, выполнится Ваша логика.

using System;

struct Pct(double value) {
    public double Value { get; } = value;
    public Pct() : this(100) { }
}

Console.WriteLine(new Pct().Value); // 100

Семантика значений сохраняется

Структуры по-прежнему копируются по значению. Основной конструктор этого не меняет: при присваивании структуры копируются все её поля.

using System;

struct Counter(int n) {
    public int N { get; set; } = n;
}

var a = new Counter(1);
var b = a;       // copy
b.N = 99;
Console.WriteLine(a.N + " " + b.N); // 1 99

Инициализация изменяемых полей

Вы можете инициализировать из параметров свойства или поля, допускающие присваивание, хотя обычно предпочтительнее неизменяемые структуры.

using System;

struct Bag(int capacity) {
    public int Capacity { get; set; } = capacity;
    public int Used { get; set; } = 0;
}

var bag = new Bag(10);
bag.Used = 3;
Console.WriteLine(bag.Capacity - bag.Used); // 7

Деконструирование

Сочетайте основной конструктор с методом Deconstruct, чтобы получить распаковку, похожую на распаковку кортежа.

using System;

struct Point(int x, int y) {
    public int X => x;
    public int Y => y;
    public void Deconstruct(out int a, out int b) { a = x; b = y; }
}

var (px, py) = new Point(7, 8);
Console.WriteLine(px + "," + py); // 7,8

Собираем всё вместе

Небольшой неизменяемый тип-значение, созданный с помощью readonly struct и основного конструктора.

using System;

readonly struct Temperature(double celsius) {
    public double Celsius { get; } = celsius;
    public double Fahrenheit => Celsius * 9 / 5 + 32;
}

var t = new Temperature(25);
Console.WriteLine(t.Fahrenheit); // 77

Быстрая проверка

Проверьте, насколько хорошо Вы поняли основные конструкторы структур.

Итоги

Вы узнали об основных конструкторах структур.

  • struct P(int x, int y) объявляет параметры в заголовке.
  • Неявный конструктор без параметров по-прежнему существует.
  • Сочетайте его с readonly struct, чтобы создавать неизменяемые типы-значения.
  • Дополнительные конструкторы образуют цепочку с помощью : this(...).

Часто задаваемые вопросы

Урок «Основные конструкторы структур» бесплатный?

Да — полный текст урока «Основные конструкторы структур» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C# Academy, подпишись на CoddyKit PRO. Курс C# Academy содержит 4 уроков всего.

Чему я научусь в уроке «Основные конструкторы структур»?

Применяйте основные конструкторы к типам значений. Ты практикуешь C# Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать C# Academy?

Предыдущий опыт не требуется. C# Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Основные конструкторы структур»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке C# Academy?

Да. Каждый урок C# Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

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

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