【C#】式形式のメンバー(Expression-Bodied Members):=>でメソッドやプロパティを簡潔に書く方法

目次

{ return ...; } の冗長性

C#のクラスでメソッドやプロパティを定義する際、その処理内容が非常に単純な場合があります。

例えば、privateなフィールドの値を返すだけのgetアクセサーや、2つのプロパティを足した結果を返すだけのメソッドなどです。

// 従来のメソッド定義
public int GetSum(int a, int b)
{
    return a + b;
}

// 従来の読み取り専用プロパティ定義
private string _firstName = "Taro";
private string _lastName = "Yamada";
public string FullName
{
    get
    {
        return _firstName + " " + _lastName;
    }
}

これらの定義は、処理の実体(return a + b;)が1行であるにもかかわらず、{ }(波括弧)やreturnキーワードのために複数行を要し、コードが冗長になりがちです。

この問題を解決し、コードをより簡潔にするために、C# 6.0以降では「式形式のメンバー(Expression-Bodied Members)」という構文が導入されました。


=>(ラムダ矢印)による式形式の定義

式形式のメンバーは、=>(ラムダ矢印)を使用して、メソッドやプロパティの本体を単一の「式(Expression)」として定義します。

{ ... } ブロックと return キーワードが不要になるのが最大の特徴です。


1. 式形式のメソッド (Expression-Bodied Methods)

メソッドの本体が1行の式で構成される場合、=> を使って書き換えることができます。

構文: [戻り値の型] [メソッド名]([引数]) => [単一の式];

コード例(メソッド)

using System;

public class Calculation
{
    // --- 従来の { return ...; } 形式 ---
    public int Add_Traditional(int a, int b)
    {
        return a + b;
    }

    // --- 式形式 (=>) ---
    // { return ...; } が => ...; に置き換わる
    public int Add_ExpressionBodied(int a, int b) => a + b;

    // 戻り値が void のメソッドでも使用可能
    public void PrintMessage(string message) => Console.WriteLine($"[LOG]: {message}");
}

public class MethodExample
{
    public static void Main()
    {
        var calc = new Calculation();
        
        // どちらも同じ結果 (30) を返す
        Console.WriteLine(calc.Add_Traditional(10, 20));
        Console.WriteLine(calc.Add_ExpressionBodied(10, 20));

        // void メソッドの呼び出し
        calc.PrintMessage("処理が完了しました。");
    }
}

出力結果:

30
30
[LOG]: 処理が完了しました。

2. 式形式のプロパティ (Expression-Bodied Properties)

この => 構文は、「読み取り専用プロパティ(Get-only Property)」の get アクセサーの省略形としても使用できます。

{ get { return ...; } } という冗長な記述を、=> [式]; だけで置き換えられます。これは「算出プロパティ(Computed Property)」とも呼ばれます。

コード例(プロパティ)

Employeeクラスが持つFirstNameLastNameから、FullName(氏名)を動的に計算して返すプロパティの例です。

using System;

public class Employee
{
    public string FirstName { get; set; }
    public string LastName { get; set; }

    // --- 従来の { get; } 形式 ---
    public string FullName_Traditional
    {
        get
        {
            return $"{FirstName} {LastName}";
        }
    }

    // --- 式形式 (=>) ---
    // データを保持せず、アクセスされるたびに式が評価される
    public string FullName_ExpressionBodied => $"{FirstName} {LastName}";

    // (参考) 読み取り専用の自動実装プロパティ(コンストラクタで設定)
    public int EmployeeId { get; }

    public Employee(int id)
    {
        this.EmployeeId = id;
    }
}

public class PropertyExample
{
    public static void Main()
    {
        var emp = new Employee(101)
        {
            FirstName = "Taro",
            LastName = "Suzuki"
        };

        // どちらのプロパティも同じ結果を返す
        Console.WriteLine($"ID: {emp.EmployeeId}");
        Console.WriteLine($"氏名 (従来): {emp.FullName_Traditional}");
        Console.WriteLine($"氏名 (式形式): {emp.FullName_ExpressionBodied}");
    }
}

出力結果:

ID: 101
氏名 (従来): Taro Suzuki
氏名 (式形式): Taro Suzuki

FullName_ExpressionBodiedプロパティは、それ自体がデータを格納しているわけではなく、FirstNameLastNameから都度計算した結果を返します。


まとめ

=>(ラムダ矢印)を使用した「式形式のメンバー」は、C#のコードをより簡潔にし、可読性を高めるための強力な構文です。

  • メソッドvoid型を含む)
  • 読み取り専用プロパティgetのみ)

上記のように、処理の本体が「単一の式(return文1行)」で表現できる場合は、{ }returnを省略して=>構文を使用することを検討する価値があります。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次