0Pricing
C# Academy · レッスン

構造体:値セマンティクスと不変パターン

C# 6における構造体の値セマンティクスを理解し、不変な構造体のパターン(変更時にコピーする方式)を構築します。

「構造体:値セマンティクスと不変パターン」はCoddyKit上の無料C# Academyレッスンです。 これはレッスン1/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これは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);
  }
}

値渡しと ref 渡し

メソッドは既定でコピーを受け取ります。呼び出し元の構造体を変更するには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
  }
}

ボックス化の基本

ボックス化では、構造体を object/interface 参照にコピーします。ボックス化解除では別のコピーが作成されます。

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時間対応のAIチューター)、C# Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C# Academyコースには全3レッスンが含まれています。

「構造体:値セマンティクスと不変パターン」で何を学びますか?

C# 6における構造体の値セマンティクスを理解し、不変な構造体のパターン(変更時にコピーする方式)を構築します。 ブラウザで直接実行するハンズオンコードでC# Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C# Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC# Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/3です。

「構造体:値セマンティクスと不変パターン」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC# Academyレッスンでコードを書いて実行できますか?

はい。すべてのC# Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 構造体:値セマンティクスと不変パターン
  2. レコード風の型と値ベースの等価性(パターン)
  3. 列挙型と[Flags]
← C# Academyに戻る