表達身體的功能成員

表達體功能成員允許使用 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 };
}

限制

表達體功能成員有一些限制。它們不能包含塊語句和包含塊的任何其他語句:ifswitchforforeachwhiledotry 等。

一些 if 語句可以用三元運算子替換。一些 forforeach 語句可以轉換為 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();