表達身體的功能成員
表達體功能成員允許使用 lambda 表示式作為成員體。對於簡單的成員,它可以使程式碼更清晰,更易讀。
表示式功能可用於屬性,索引器,方法和運算子。
屬性
public decimal TotalPrice => BasePrice + Taxes;
相當於:
public decimal TotalPrice
{
get
{
return BasePrice + Taxes;
}
}
當表示式函式與屬性一起使用時,該屬性被實現為僅具有 getter 的屬性。
索引
public object this[string key] => dictionary[key];
相當於:
public object this[string key]
{
get
{
return dictionary[key];
}
}
方法
static int Multiply(int a, int b) => a * b;
相當於:
static int Multiply(int a, int b)
{
return a * b;
}
其中也可以使用 void
方法:
public void Dispose() => resource?.Dispose();
可以在 Pair<T>
類中新增 ToString
的覆蓋:
public override string ToString() => $"{First}, {Second}";
此外,這種簡單的方法適用於 override
關鍵字:
public class Foo
{
public int Bar { get; }
public string override ToString() => $"Bar: {Bar}";
}
運算子
這也可以由運算子使用:
public class Land
{
public double Area { get; set; }
public static Land operator +(Land first, Land second) =>
new Land { Area = first.Area + second.Area };
}
限制
表達體功能成員有一些限制。它們不能包含塊語句和包含塊的任何其他語句:if
,switch
,for
,foreach
,while
,do
,try
等。
一些 if
語句可以用三元運算子替換。一些 for
和 foreach
語句可以轉換為 LINQ 查詢,例如:
IEnumerable<string> Digits
{
get
{
for (int i = 0; i < 10; i++)
yield return i.ToString();
}
}
IEnumerable<string> Digits => Enumerable.Range(0, 10).Select(i => i.ToString());
在所有其他情況下,可以使用函式成員的舊語法。
表達體功能成員可以包含 async
/ await
,但它通常是多餘的:
async Task<int> Foo() => await Bar();
可以替換為:
Task<int> Foo() => Bar();