式形式のメンバー (C# プログラミング ガイド)

式本体の定義を使用すると、簡潔でわかりやすい形式でメンバーの実装を指定できます。 サポートされる任意のメンバー (メソッドやプロパティなど) に関するロジックが単一の式で構成される場合は、常に式本体の定義を使用できます。 式本体の定義には、次の一般的な構文があります。

member => expression;

この expression には有効な式を指定します。

式本体の定義のサポートは、メソッドとプロパティの get アクセサーのために C# 6 で導入され、C# 7 で拡張されました。 式本体の定義は、次の表の方メンバーで使用できます。

メンバー サポートが開始されたバージョン
メソッド C# 6
コンストラクター C# 7
ファイナライザー C# 7
プロパティの取得 C# 6
プロパティの設定 C# 7
インデクサー C# 7

メソッド

式形式のメソッドは、型がメソッドの戻り値の型と一致する値を返す単一の式、または、void を返すメソッドの場合は何らかの処理を実行する単一の式で構成されます。 たとえば、一般的に、<xref:System.Object.ToString%2A> メソッドをオーバーライドする型には、現在のオブジェクトの文字列形式を返す単一の式が含まれています。

次の例では、式本体の定義を使用して <xref:System.Object.ToString%2A> メソッドをオーバーライドする Person クラスを定義します。 また、名前をコンソールに表示する Show メソッドも定義します。 ToString 式本体の定義に return キーワードが使用されていない点に注意してください。

using System;

public class Person
{
   public Person(string firstName, string lastName)
   {
      fname = firstName;
      lname = lastName;
   }

   private string fname;
   private string lname;
   
   public override string ToString() => $"{fname} {lname}".Trim();
   public void DisplayName() => Console.WriteLine(ToString());
}

class Example
{
   static void Main()
   {
      Person p = new Person("Mandy", "Dejesus");
      Console.WriteLine(p);
      p.DisplayName();
   }
}

詳細については、「メソッド (C# プログラミング ガイド)」を参照してください。

コンストラクター

一般的に、コンストラクターの式本体の定義は、コンストラクターの引数を処理したり、インスタンスの状態を初期化したりする単一の代入式またはメソッド呼び出しから構成されます。

次の例では、コンストラクターに name という名前の文字列パラメーターが 1 つある Location クラスが定義されています。 式の本体の定義により Name プロパティに引数が割り当てられます。

public class Location
{
   private string locationName;
   
   public Location(string name) => locationName = name;

   public string Name
   {
      get => locationName;
      set => locationName = value;
   } 
}

詳細については、「コンストラクター (C# プログラミング ガイド)」を参照してください。

ファイナライザー

一般的に、ファイナライザーの式本体の定義には、アンマネージ リソースをリリースするステートメントなどのクリーンアップ ステートメントが含まれています。

次の例では、式本体の定義を使用して、ファイナライザーが呼び出されたことを示すファイナライザーを定義します。

using System;

public class Destroyer
{
   public override string ToString() => GetType().Name;
   
   ~Destroyer() => Console.WriteLine($"The {ToString()} destructor is executing.");
}

詳細については、「ファイナライザー (C# プログラミング ガイド)」を参照してください。

プロパティの get ステートメント

プロパティの get アクセサーを自分で実装する場合、プロパティの値を返すだけの単一の式に式本体の定義を使用できます。 return ステートメントは使用されません。

次の例では、Location.Name プロパティを定義します。このプロパティの get アクセサーは、プロパティをバックするプライベート locationName フィールドの値を返します。

public class Location
{
   private string locationName;
   
   public Location(string name) => locationName = name;

   public string Name
   {
      get => locationName;
      set => locationName = value;
   } 
}

式本体の定義を使用する読み取り専用のプロパティは、明示的な set ステートメントなしで実装できます。 構文は次のとおりです。

PropertyName => returnValue;

次の例では、プライベート locationName フィールドの値を返す式本体の定義として読み取り専用の Name プロパティを実装する Location クラスを定義します。

public class Location
{
   private string locationName;
   
   public Location(string name) => locationName = name;

   public string Name => locationName;
}

詳細については、「プロパティ (C# プログラミング ガイド)」を参照してください。

プロパティの set ステートメント

プロパティの set アクセサーを自分で実装する場合、プロパティをバックするフィールドに値を代入する単一行の式に式本体の定義を使用できます。

次の例では、Location.Name プロパティを定義します。このプロパティの set ステートメントで、プロパティをバックするプライベート locationName フィールドにその入力引数を代入します。

public class Location
{
   private string locationName;
   
   public Location(string name) => locationName = name;

   public string Name
   {
      get => locationName;
      set => locationName = value;
   } 
}

詳細については、「プロパティ (C# プログラミング ガイド)」を参照してください。

インデクサー

プロパティと同様に、get アクセサーが値を返す単一のステートメントで構成される場合、または set アクセサーが単純な代入を実行する場合、インデクサーの get と set アクセサーは、式本体の定義で構成されます。

次の例では、Sports というクラスを定義します。このクラスには、複数のスポーツ名を含む内部 <xref:System.String> 配列があります。 インデクサーの get および set アクセサーはいずれも、式本体の定義として実装されます。

using System;
using System.Collections.Generic;

public class Sports
{
   private string[] types = { "Baseball", "Basketball", "Football", 
                              "Hockey", "Soccer", "Tennis", 
                              "Volleyball" }; 

   public string this[int i]
   {
      get => types[i];
      set => types[i] = value;
   }
}

詳細については、「インデクサー (C# プログラミング ガイド)」を参照してください。