C# 7.0 から、プロパティの get アクセサーと set アクセサーの両方を「式形式のメンバー(Expression-bodied members)」として記述できるようになりました。
従来はブロック { ... } と return 文を用いて記述していたプロパティ定義を、アロー演算子 => を用いてシンプルに記述できます。これにより、単純な読み書きや、1行で完結するロジックを持つプロパティのコード量を削減し、可読性を向上させることができます。
本記事では、ユーザー名を管理するクラスを例に、値の検証ロジックを含んだプロパティを式形式で実装する方法を解説します。
実装例:値の検証を行うプロパティ
以下のコードは、プロパティ UserName に null が設定されようとした際、自動的にデフォルト値を代入するロジックを実装しています。get と set の両方が式形式で記述されている点に注目してください。
using System;
namespace ExpressionBodiedPropertyExample
{
class Program
{
static void Main(string[] args)
{
var user = new UserProfile();
// 1. 通常の値を設定
user.UserName = "Alice";
Console.WriteLine($"設定値: {user.UserName}");
// 2. nullを設定(setアクセサーのロジックが動く)
user.UserName = null;
Console.WriteLine($"null設定後の値: {user.UserName}");
}
}
public class UserProfile
{
// バッキングフィールド(値を実際に保持する変数)
private string _userName = "Unknown User";
public string UserName
{
// getアクセサー: フィールドの値をそのまま返す
// 従来: get { return _userName; }
get => _userName;
// setアクセサー: 値がnullならデフォルト値を、それ以外なら値を代入する
// 従来: set { _userName = value ?? "Guest"; }
set => _userName = value ?? "Guest";
}
}
}
解説
1. 構文の簡略化
C# 6.0 では get アクセサーのみ式形式に対応していましたが、C# 7.0 以降では set アクセサーも同様に記述可能です。
- Get:
get => 式;は、その式の結果を返します(暗黙的なreturn)。 - Set:
set => 式;は、その式を実行します。右辺には代入式やメソッド呼び出しなどを記述できます。
2. null合体演算子との組み合わせ
コード例の value ?? "Guest" は、「代入しようとしている値(value)が null であれば、代わりに "Guest" を使用する」という処理を簡潔に表しています。このように、単純なガード節や変換ロジックを含む set アクセサーは、式形式と非常に相性が良いです。
まとめ
式形式のプロパティ定義を利用することで、ボイラープレートコード(定型的な記述)を減らし、ロジックの本質的な部分を際立たせることができます。
- 単純なラッパー:
get => _field; set => _field = value; - 値の加工:
set => _field = value.Trim();
ただし、複数行にわたる複雑な処理が必要な場合は、無理に式形式にせず、従来のブロック { ... } を使用して可読性を維持することを推奨します。
