式形式のメンバー (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.

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

メンバーMember サポートが開始されたバージョンSupported as of...
メソッドMethod C# 6C# 6
読み取り専用プロパティRead-only property C# 6C# 6
PropertyProperty C# 7.0C# 7.0
コンストラクターConstructor C# 7.0C# 7.0
ファイナライザーFinalizer C# 7.0C# 7.0
インデクサーIndexer C# 7.0C# 7.0

メソッド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. また、名前をコンソールに表示する DisplayName メソッドも定義します。It also defines a DisplayName 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).

読み取り専用プロパティRead-only properties

C# 6 以降では、式本体の定義を使用して読み取り専用プロパティを実装することができます。Starting with C# 6, you can use expression body definition to implement a read-only property. そのためには、次の構文を使用します。To do that, use the following syntax:

PropertyType PropertyName => expression;

次の例では、プライベート 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 about properties, see Properties (C# Programming Guide).

プロパティProperties

C# 7.0 以降では、式本体の定義を使用してプロパティ getset アクセサーを実装することができます。Starting with C# 7.0, you can use expression body definitions to implement property get and set accessors. これを実行する方法を次の例に示します。The following example demonstrates how to do that:

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

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

プロパティの詳細については、「プロパティ (C# プログラミング ガイド)」を参照してください。For more information about properties, see Properties (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) => Name = 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).

インデクサーIndexers

プロパティと同様に、get アクセサーが値を返す単一のステートメントで構成される場合、または set アクセサーがシンプルな代入を実行する場合、インデクサーの getset アクセサーは、式本体の定義で構成されます。Like with properties, indexer get and set accessors consist of expression body definitions if the get accessor consists of a single expression 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 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).