0Pricing
C# Academy · Урок

Структуры: семантика значений и шаблон неизменяемости

Изучите семантику значений структур в C# 6 и создайте шаблон неизменяемой структуры (копирование при изменении).

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

Обзор структур

Цель: Безопасно использовать структуры.

  • Семантика значений (копирование при присваивании)
  • Шаблон неизменяемой структуры в C# 6
  • Передача по значению и по ref
  • Примечание об упаковке

Семантика копирования

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

using System;

// Simple struct with public fields for demo (okay for small POD data)
public struct Point
{
  public int X;
  public int Y;
}

public class Program
{
  public static void Main(string[] args)
  {
    Point a = new Point();
    a.X = 1; a.Y = 2;

    Point b = a;     // copy the value
    b.X = 9;         // change the copy

    Console.WriteLine("a=(" + a.X + "," + a.Y + ")");
    Console.WriteLine("b=(" + b.X + "," + b.Y + ")"); // different from a
  }
}

Шаблон неизменяемой структуры

Предпочитайте неизменяемые структуры: поля readonly, конструктор для обязательного состояния и небольшие вспомогательные методы With для создания новых значений.

using System;

// Immutable struct pattern (C# 6): readonly fields + constructor + With method
public struct Money
{
  private readonly decimal _amount;
  private readonly string _currency;

  public decimal Amount { get { return _amount; } }
  public string Currency { get { return _currency; } }

  public Money(decimal amount, string currency)
  {
    _amount = amount;
    _currency = currency ?? "USD";
  }

  // Copy-on-change: returns a new value with updated amount
  public Money WithAmount(decimal amount)
  {
    return new Money(amount, _currency);
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    Money m1 = new Money(10m, "USD");
    Money m2 = m1.WithAmount(15m); // new value

    Console.WriteLine("m1: " + m1.Amount + " " + m1.Currency);
    Console.WriteLine("m2: " + m2.Amount + " " + m2.Currency);
  }
}

Передача по значению и по ссылке

По умолчанию methods получают копию. Используйте ref, чтобы изменить структуру вызывающего кода.

using System;

public struct Counter
{
  public int Value;
}

public class Program
{
  static void IncrementByValue(Counter c)
  {
    c.Value = c.Value + 1; // changes only the local copy
  }

  static void IncrementByRef(ref Counter c)
  {
    c.Value = c.Value + 1; // changes the caller's variable
  }

  public static void Main(string[] args)
  {
    Counter a = new Counter();
    IncrementByValue(a);
    Console.WriteLine("After by-value: " + a.Value); // 0

    IncrementByRef(ref a);
    Console.WriteLine("After by-ref: " + a.Value);   // 1
  }
}

Основы упаковки

Упаковка копирует структуру в ссылку на объект или интерфейс. Распаковка создаёт ещё одну копию.

using System;

public interface IShow { string Show(); }

public struct Temperature : IShow
{
  public int C;
  public string Show() { return C + "C"; }
}

public class Program
{
  public static void Main(string[] args)
  {
    Temperature t = new Temperature();
    t.C = 25;

    object boxed = t;              // boxing: copy into object
    Temperature copy = (Temperature)boxed; // unbox (another copy)
    copy.C = 30;

    Console.WriteLine("t = " + t.C);     // 25
    Console.WriteLine("copy = " + copy.C); // 30
  }
}

Советы по структурам

Советы:

  • Используйте структуры для небольших неизменяемых объектов-значений (координат, денег).
  • Избегайте больших или часто изменяемых структур.
  • Помните о копировании при присваивании и передаче по значению.
  • Учитывайте упаковку при приведении к object или interface.

Семантика значений структур

Быстрая проверка: что лучше всего описывает семантику значений структуры в C#?

Итоги

Итоги: Структуры являются типами-значениями. Предпочитайте небольшие неизменяемые конструкции (конструктор + поля readonly + With). Учитывайте, как передача по значению и через ref, а также упаковка влияют на копирование.

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

Урок «Структуры: семантика значений и шаблон неизменяемости» бесплатный?

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

Чему я научусь в уроке «Структуры: семантика значений и шаблон неизменяемости»?

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

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

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

Сколько времени занимает урок «Структуры: семантика значений и шаблон неизменяемости»?

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

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

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

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

  1. Структуры: семантика значений и шаблон неизменяемости
  2. Типы, подобные записям, и равенство на основе значений
  3. Перечисления и [Flags]
← Назад к C# Academy