表达身体的功能成员

表达体功能成员允许使用 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();