0Pricing
C# Academy · レッスン

レコードのwith式

不変オブジェクトの変更されたコピーを作成します。

「レコードのwith式」はCoddyKit上の無料C# Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC# Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C# Academyコースには全4レッスンが含まれています。

with 式

with式は、一部のプロパティを変更したレコードのコピーを作成し、元のレコードには手を加えません。不変レコードを「更新」するための標準的な方法です。

using System;

record Point(int X, int Y);

var a = new Point(1, 2);
var b = a with { Y = 9 };
Console.WriteLine(a + " | " + b); // Point { X = 1, Y = 2 } | Point { X = 1, Y = 9 }

非破壊的な変更

元のレコードが変更されることはありません。withは浅いコピーを作成し、指定された変更をコピーにだけ適用します。

using System;

record User(string Name, int Age);

var original = new User("Ada", 30);
var older = original with { Age = 31 };
Console.WriteLine(original.Age + " " + older.Age); // 30 31

複数のプロパティを変更する

中かっこの内側に複数の代入を記述すると、一度に複数のプロパティを変更できます。

using System;

record Config(string Env, int Retries, bool Verbose);

var baseCfg = new Config("dev", 3, false);
var prod = baseCfg with { Env = "prod", Verbose = true };
Console.WriteLine(prod.Env + " " + prod.Retries + " " + prod.Verbose); // prod 3 True

変更しないプロパティのコピー

指定していないプロパティは、ソースレコードからそのままコピーされます。

using System;

record Product(string Name, decimal Price, int Stock);

var p = new Product("Book", 12m, 5);
var discounted = p with { Price = 10m };
Console.WriteLine(discounted.Name + " " + discounted.Stock); // Book 5

with と値の等価性

レコードは値による等価性を使用するため、何も変更しないコピーは元のレコードと等しくなります。

using System;

record Coord(int X, int Y);

var a = new Coord(1, 2);
var b = a with { };
Console.WriteLine(a == b);         // True (value equal)
Console.WriteLine(ReferenceEquals(a, b)); // False (different objects)

シャローコピーのセマンティクス

with は深いオブジェクトグラフではなく、参照をコピーします。ネストされた可変オブジェクトは、元のレコードとコピーの間で共有されます。

using System;
using System.Collections.Generic;

record Cart(List<string> Items);

var a = new Cart(new List<string> { "x" });
var b = a with { };
b.Items.Add("y"); // shared list!
Console.WriteLine(a.Items.Count); // 2

record struct での with

record struct も with をサポートしており、値型の変更されたコピーを生成します。

using System;

record struct Size(int W, int H);

var s = new Size(4, 4);
var wide = s with { W = 8 };
Console.WriteLine(wide.W + "x" + wide.H); // 8x4

with 式の連鎖

with 式は連鎖させることができます。各式で新しいレコードを生成しながら、一連の変更を適用できます。

using System;

record Point(int X, int Y, int Z);

var p = new Point(0, 0, 0)
    with { X = 1 }
    with { Y = 2 }
    with { Z = 3 };
Console.WriteLine(p); // Point { X = 1, Y = 2, Z = 3 }

ビルダー不要の更新

with を使えば、ビルダークラスは必要ありません。コピーして、変更したいフィールドだけを調整します。

using System;

record Email(string To, string Subject, string Body);

var draft = new Email("a@b.com", "Hi", "");
var ready = draft with { Body = "Welcome!" };
Console.WriteLine(ready.Body); // Welcome!

カスタムコピー処理

レコードは、with が使用する protected なコピーコンストラクターを生成します。独自のコピーコンストラクターを宣言して、コピー方法をカスタマイズすることもできます。

using System;

record Audited(string Name) {
    public int Version { get; init; } = 1;
    protected Audited(Audited other) {
        Name = other.Name;
        Version = other.Version + 1; // bump on every copy
    }
}

var a = new Audited("x");
var b = a with { };
Console.WriteLine(a.Version + " " + b.Version); // 1 2

まとめ

with で状態遷移をモデル化すると、監査しやすい不変の履歴を維持できます。

using System;

record Order(string Id, string Status);

var created = new Order("O1", "Created");
var paid = created with { Status = "Paid" };
var shipped = paid with { Status = "Shipped" };
Console.WriteLine(created.Status + " -> " + paid.Status + " -> " + shipped.Status);

クイックチェック

with 式についての理解度を確認します。

まとめ

レコードの with 式について学びました。

  • a with { Prop = value } は、指定したプロパティをコピーして変更します。
  • 元のレコードが変更されることはありません。これは非破壊的な操作です。
  • コピーはシャローコピーであるため、ネストされた可変オブジェクトは共有されます。
  • レコードと record struct の両方で使用でき、連鎖させることもできます。

よくある質問

「レコードのwith式」レッスンは無料ですか?

はい。「レコードのwith式」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C# Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C# Academyコースには全4レッスンが含まれています。

「レコードのwith式」で何を学びますか?

不変オブジェクトの変更されたコピーを作成します。 ブラウザで直接実行するハンズオンコードでC# Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「レコードのwith式」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

  1. init専用setter
  2. required修飾子
  3. 不変オブジェクトのパターン
  4. レコードのwith式
← C# Academyに戻る