運算式主體成員 (C# 程式設計手冊)
運算式主體定義可讓您以簡潔且可讀的形式提供成員的實作。 只要任何所支援成員 (例如方法或屬性) 的邏輯包含單一運算式,就可以使用運算式主體定義。 運算式主體定義的一般語法如下︰
member => expression;
其中 expression 是有效的運算式。
運算式主體定義可以與下列型別成員搭配使用:
方法
運算式主體方法包含傳回型別符合方法傳回型別之值的單一運算式,或是傳回可執行某項作業之 void
的方法。 例如,覆寫 ToString 方法的類型通常會包括可傳回目前物件之字串表示的單一運算式。
下列範例定義 Person
類別,以將 ToString 方法覆寫為運算式主體定義。 它也會定義 DisplayName
方法,以向主控台顯示名稱。 return
關鍵字未用於 ToString
運算式主體定義中。
using System;
namespace ExpressionBodiedMembers;
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# 程式設計手冊)。
唯讀屬性
您可以使用運算式主體定義來實作唯讀屬性。 若要這麼做,請使用下列語法:
PropertyType PropertyName => expression;
下列範例會定義 Location
類別,其唯讀 Name
屬性會實作為可傳回私用 locationName
欄位值的運算式主體定義:
public class Location
{
private string locationName;
public Location(string name)
{
locationName = name;
}
public string Name => locationName;
}
如需屬性的詳細資訊,請參閱屬性 (C# 程式設計手冊)。
屬性
您可以使用運算式主體定義來實作屬性 get
和 set
存取子。 下列範例示範如何進行這項操作:
public class Location
{
private string locationName;
public Location(string name) => Name = name;
public string Name
{
get => locationName;
set => locationName = value;
}
}
如需屬性的詳細資訊,請參閱屬性 (C# 程式設計手冊)。
事件
同樣地,事件 add
和 remove
存取子可以是運算式主體:
public class ChangedEventArgs : EventArgs
{
public required int NewValue { get; init; }
}
public class ObservableNum(int _value)
{
public event EventHandler<ChangedEventArgs> ChangedGeneric = default!;
public event EventHandler Changed
{
// Note that, while this is syntactically valid, it won't work as expected because it's creating a new delegate object with each call.
add => ChangedGeneric += (sender, args) => value(sender, args);
remove => ChangedGeneric -= (sender, args) => value(sender, args);
}
public int Value
{
get => _value;
set => ChangedGeneric?.Invoke(this, new() { NewValue = (_value = 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# 程式設計手冊)。
完成項
完成項的運算式主體定義通常包含清除陳述式,例如,發行不受管理資源的陳述式。
下列範例定義完成項,以使用運算式主體定義來指出已呼叫完成項。
public class Destroyer
{
public override string ToString() => GetType().Name;
~Destroyer() => Console.WriteLine($"The {ToString()} finalizer is executing.");
}
如需詳細資訊,請參閱完成項 (C# 程式設計手冊)。
索引子
如同屬性,如果 get
存取子包含傳回值的單一陳述式,或 set
存取子執行簡單指派,則索引子的 get
和 set
存取子會包含運算式主體定義。
下列範例會定義名為 Sports
的類別,這個類別包括內含一些運動名稱的內部 String 陣列。 索引子 get
和 set
存取子會實作為運算式主體定義。
using System;
using System.Collections.Generic;
namespace SportsExample;
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# 程式設計手冊)。