{ 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クラスが持つFirstNameとLastNameから、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プロパティは、それ自体がデータを格納しているわけではなく、FirstNameやLastNameから都度計算した結果を返します。
まとめ
=>(ラムダ矢印)を使用した「式形式のメンバー」は、C#のコードをより簡潔にし、可読性を高めるための強力な構文です。
- メソッド(
void型を含む) - 読み取り専用プロパティ(
getのみ)
上記のように、処理の本体が「単一の式(return文1行)」で表現できる場合は、{ }とreturnを省略して=>構文を使用することを検討する価値があります。
