レコードの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 5with と値の等価性
レコードは値による等価性を使用するため、何も変更しないコピーは元のレコードと等しくなります。
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); // 2record 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); // 8x4with 式の連鎖
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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- init専用setter
- required修飾子
- 不変オブジェクトのパターン
- レコードのwith式