C#-9

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#のプロジェクトに取り組むことができます。お疲れ様でした!👏