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