式形式のメンバー (C# プログラミング ガイド)Expression-bodied members (C# programming guide)

式本体の定義を使用すると、簡潔でわかりやすい形式でメンバーの実装を指定できます。Expression body definitions let you provide a member's implementation in a very concise, readable form. サポートされる任意のメンバー (メソッドやプロパティなど) に関するロジックが単一の式で構成される場合は、常に式本体の定義を使用できます。You can use an expression body definition whenever the logic for any supported member, such as a method or property, consists of a single expression. 式本体の定義には、次の一般的な構文があります。An expression body definition has the following general syntax:

member => expression;

この expression には有効な式を指定します。where expression is a valid expression.

式本体の定義のサポートは、メソッドとプロパティの get アクセサーのために C# 6 で導入され、C# 7 で拡張されました。Support for expression body definitions was introduced for methods and property get accessors in C# 6 and was expanded in C# 7. 式本体の定義は、次の表の方メンバーで使用できます。Expression body definitions can be used with the type members listed in the following table:

メンバーMember サポートが開始されたバージョンSupported as of...
メソッドMethod C# 6C# 6
コンストラクターConstructor C# 7C# 7
ファイナライザーFinalizer C# 7C# 7
プロパティの取得Property Get C# 6C# 6
プロパティの設定Property Set C# 7C# 7
インデクサーIndexer C# 7C# 7

メソッドMethods

式形式のメソッドは、型がメソッドの戻り値の型と一致する値を返す単一の式、または、void を返すメソッドの場合は何らかの処理を実行する単一の式で構成されます。An expression-bodied method consists of a single expression that returns a value whose type matches the method's return type, or, for methods that return void, that performs some operation. たとえば、一般的に、ToString メソッドをオーバーライドする型には、現在のオブジェクトの文字列形式を返す単一の式が含まれています。For example, types that override the ToString method typically include a single expression that returns the string representation of the current object.

次の例では、式本体の定義を使用して ToString メソッドをオーバーライドする Person クラスを定義します。The following example defines a Person class that overrides the ToString method with an expression body definition. また、名前をコンソールに表示する Show メソッドも定義します。It also defines a Show method that displays a name to the console. ToString 式本体の定義に return キーワードが使用されていない点に注意してください。Note that the return keyword is not used in the ToString expression body definition.

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# プログラミング ガイド)」を参照してください。For more information, see Methods (C# Programming Guide).

コンストラクターConstructors

一般的に、コンストラクターの式本体の定義は、コンストラクターの引数を処理したり、インスタンスの状態を初期化したりする単一の代入式またはメソッド呼び出しから構成されます。An expression body definition for a constructor typically consists of a single assignment expression or a method call that handles the constructor's arguments or initializes instance state.

次の例では、コンストラクターに name という名前の文字列パラメーターが 1 つある Location クラスが定義されています。The following example defines a Location class whose constructor has a single string parameter named name. 式の本体の定義により Name プロパティに引数が割り当てられます。The expression body definition assigns the argument to the Name property.

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

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

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

ファイナライザーFinalizers

一般的に、ファイナライザーの式本体の定義には、アンマネージ リソースをリリースするステートメントなどのクリーンアップ ステートメントが含まれています。An expression body definition for a finalizer typically contains cleanup statements, such as statements that release unmanaged resources.

次の例では、式本体の定義を使用して、ファイナライザーが呼び出されたことを示すファイナライザーを定義します。The following example defines a finalizer that uses an expression body definition to indicate that the finalizer has been called.

using System;

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

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

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

プロパティの get アクセサーを自分で実装する場合、プロパティの値を返すだけの単一の式に式本体の定義を使用できます。If you choose to implement a property get accessor yourself, you can use an expression body definition for single expressions that simply return the property value. return ステートメントは使用されません。Note that the return statement isn't used.

次の例では、Location.Name プロパティを定義します。このプロパティの get アクセサーは、プロパティをバックするプライベート locationName フィールドの値を返します。The following example defines a Location.Name property whose property get accessor returns the value of the private locationName field that backs the property.

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

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

式本体の定義を使用する読み取り専用のプロパティは、明示的な set ステートメントなしで実装できます。Read-only properties that use an expression body definition can be implemented without an explicit set statement. 構文は次のとおりです。The syntax is:

PropertyName => returnValue;

次の例では、プライベート locationName フィールドの値を返す式本体の定義として読み取り専用の Name プロパティを実装する Location クラスを定義します。The following example defines a Location class whose read-only Name property is implemented as an expression body definition that returns the value of the private locationName field.

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

   public string Name => locationName;
}

詳細については、「プロパティ (C# プログラミング ガイド)」を参照してください。For more information, see Properties (C# Programming Guide).

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

プロパティの set アクセサーを自分で実装する場合、プロパティをバックするフィールドに値を代入する単一行の式に式本体の定義を使用できます。If you choose to implement a property set accessor yourself, you can use an expression body definition for a single-line expression that assigns a value to the field that backs the property.

次の例では、Location.Name プロパティを定義します。このプロパティの set ステートメントで、プロパティをバックするプライベート locationName フィールドにその入力引数を代入します。The following example defines a Location.Name property whose property set statement assigns its input argument to the private locationName field that backs the property.

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

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

詳細については、「プロパティ (C# プログラミング ガイド)」を参照してください。For more information, see Properties (C# Programming Guide).

インデクサーIndexers

プロパティと同様に、get アクセサーが値を返す単一のステートメントで構成される場合、または set アクセサーが単純な代入を実行する場合、インデクサーの get と set アクセサーは、式本体の定義で構成されます。Like properties, an indexer's get and set accessors consist of expression body definitions if the get accessor consists of a single statement that returns a value or the set accessor performs a simple assignment.

次の例では、Sports というクラスを定義します。このクラスには、複数のスポーツ名を含む内部 String 配列があります。The following example defines a class named Sports that includes an internal String array that contains the names of a number of sports. インデクサーの get および set アクセサーはいずれも、式本体の定義として実装されます。Both the indexer's get and set accessors are implemented as expression body definitions.

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# プログラミング ガイド)」を参照してください。For more information, see Indexers (C# Programming Guide).