運算式主體成員 (C# 程式設計手冊)

運算式主體定義可讓您以極為簡潔且可讀的形式提供成員的實作。 只要任何所支援成員 (例如方法或屬性) 的邏輯包含單一運算式,就可以使用運算式主體定義。 運算式主體定義的一般語法如下︰

member => expression;

其中 expression 是有效的運算式。

方法和唯讀屬性的運算式主體定義支援是在 C# 6 中引進,並在 C# 7.0 中擴充。 運算式主體定義可以與下表中所列的類型成員搭配使用︰

成員 支援作為...
方法 C# 6
唯讀屬性 C# 6
屬性 C# 7.0
建構函式 C# 7.0
完成項 C# 7.0
索引編製程式 C# 7.0

方法

運算式主體方法包含傳回型別符合方法傳回型別之值的單一運算式,或是傳回可執行某項作業之 void 的方法。 例如,覆寫 ToString 方法的類型通常會包括可傳回目前物件之字串表示的單一運算式。

下列範例定義 Person 類別,以將 ToString 方法覆寫為運算式主體定義。 它也會定義 DisplayName 方法,以向主控台顯示名稱。 請注意,return 關鍵字未用於 ToString 運算式主體定義中。

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# 程式設計手冊)

唯讀屬性

從 C# 6 開始,您可以使用運算式主體定義來實作唯讀屬性。 若要這麼做,請使用下列語法:

PropertyType PropertyName => expression;

下列範例會定義 Location 類別,其唯讀 Name 屬性會實作為可傳回私用 locationName 欄位值的運算式主體定義:

public class Location
{
   private string locationName;

   public Location(string name)
   {
      locationName = name;
   }

   public string Name => locationName;
}

如需屬性的詳細資訊,請參閱屬性 (C# 程式設計手冊)

屬性

從 C# 7.0 開始,您可以使用運算式主體定義來實作屬性 getset 存取子。 下列範例示範如何進行這項操作:

public class Location
{
   private string locationName;

   public Location(string name) => Name = name;

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

如需屬性的詳細資訊,請參閱屬性 (C# 程式設計手冊)

建構函式

建構函式的運算式主體定義通常會包含單一指派運算式或方法呼叫,以處理建構函式的引數,或初始化執行個體狀態。

下列範例定義 Location 類別,這個類別的建構函式包含名為 name 的單一字串參數。 運算式主體定義會將引數指派給 Name 屬性。

public class Location
{
   private string locationName;

   public Location(string name) => Name = 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# 程式設計手冊)

索引子

如同屬性,索引子 getset 存取子包含運算式主體定義,如果 get 存取子是由傳回值的單一運算式,或 set 存取子執行簡單的指派。

下列範例會定義名為 Sports 的類別,這個類別包括內含數個運動名稱的內部 String 陣列。 索引子 getset 存取子都會實作為運算式主體定義。

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# 程式設計手冊)