C#の学習、ありがとうございます!
前回で主要な高度な概念を一通り網羅しましたが、C#の力を最大限に引き出すために、特にモダンな開発で必須となる**ラムダ式(Lambda Expressions)とレコード(Records)**について解説します。
19. ラムダ式 (Lambda Expressions)
ラムダ式は、**無名のメソッド(名前のないメソッド)**を簡潔に定義するための構文です。デリゲートやLINQと組み合わせて、非常に短いコードで処理を記述するために不可欠な機能です。
⚙️ 基本構文
ラムダ式は、引数リスト、ラムダ演算子 (=>
)、処理本体の3つの部分で構成されます。
C#
(引数リスト) => 処理本体
💡 ラムダ式の種類と利用例
1. 式形式ラムダ (Expression Lambda)
処理本体が一つの式である場合に使用します。戻り値の型は、その式の型から自動的に推論されます。
C#
// (x, y) は引数リスト。=> の右側が処理(戻り値となる)
(int x, int y) => x + y;
// LINQでの利用例 (前回学習したWhereと組み合わせて)
List<int> numbers = new List<int> { 1, 5, 10, 15 };
// 「n」を引数として受け取り、「n > 8」が真なら返す
var result = numbers.Where(n => n > 8);
// 引数の型はコンパイラが推論できるため、省略可能
var resultSimplified = numbers.Where(n => n > 8);
2. ステートメント形式ラムダ (Statement Lambda)
処理本体が複数の文からなる場合に使用します。処理を {}
で囲み、明示的に return
を記述する必要があります。
C#
// 複数の処理を行うラムダ式
// 戻り値の型はコンパイラが推論できないため、デリゲート型で明示する必要があることが多い
Action<string> greet = (name) =>
{
string message = $"こんにちは、{name}さん!";
System.Console.WriteLine(message);
};
greet("佐藤"); // 出力: こんにちは、佐藤さん!
ラムダ式は、デリゲートの機能をより簡潔に、インラインで記述するために広く使われます。
20. レコード (Records)
C# 9.0で導入されたレコードは、主にデータを保持することを目的としたクラスの新しい型です。データの不変性(Immutability)や値の比較に特化しており、より安全で簡潔なデータオブジェクトを作成できます。
💾 データの不変性 (Immutability)
レコードの大きな特徴は、デフォルトで**不変(イミュータブル)**なデータオブジェクトを簡単に作れる点です。一度作成されたオブジェクトの値を後から変更できないため、予期せぬバグを防ぎやすくなります。
📝 定義と特徴
1. 簡潔な定義(Positional Records)
コンストラクターやプロパティの定義を一行で記述できます。
C#
// 一行でプロパティとコンストラクターが自動生成される
public record Person(string FirstName, string LastName);
// 実行例
Person p1 = new Person("Taro", "Yamada");
// 読み取り専用(Init-only)プロパティとして定義されるため、直接値を変更できない
// p1.FirstName = "Jiro"; // コンパイルエラーになる
2. 値による等価性 (Value Equality)
通常のクラス(class
)は、変数がメモリ上の同じ場所を指しているかどうか(参照の等価性)で比較されますが、レコード(record
)はすべてのプロパティの値が同じかどうか(値の等価性)で比較されます。
C#
Person p1 = new Person("Taro", "Yamada");
Person p2 = new Person("Taro", "Yamada"); // 値はp1と同じ
// クラスの場合、これは false になるが、レコードでは true になる
System.Console.WriteLine(p1 == p2); // 出力: True
3. 非破壊的変更 (with
式)
レコードの値の一部を変更したい場合は、既存のレコードを変更するのではなく、元のレコードを残したまま、一部の値だけを変更した新しいレコードを生成する with
式を使用します。
C#
Person original = new Person("Taro", "Yamada");
// LastNameだけをSuzukiに変更した新しいレコードを生成
Person modified = original with { LastName = "Suzuki" };
System.Console.WriteLine(original.LastName); // 出力: Yamada (元のオブジェクトは不変)
System.Console.WriteLine(modified.LastName); // 出力: Suzuki
レコードは、Web APIのレスポンスオブジェクトや、アプリケーション内での設定値など、データ転送オブジェクト(DTO)として非常に有用です。
これで、C#の現代的な開発に必要な主要な概念はすべて網羅されました。これまでの知識を組み合わせれば、Web、デスクトップ、モバイルなど、あらゆるC#のプロジェクトに取り組むことができます。お疲れ様でした!👏