表达式主体成员与 Lambda 表达式

Lla*_*zar 2 c# lambda expression-body

lambda 表达式是被视为对象的代码块(表达式或语句块)。它可以作为参数传递给方法,也可以通过方法调用返回。

(input parameters) => expression
 SomeFunction(x => x * x);
Run Code Online (Sandbox Code Playgroud)

看着这个语句,我想知道使用 lambdas 和使用 Expression-bodied 时有什么区别?

public string Name => First + " " + Last;
Run Code Online (Sandbox Code Playgroud)

Oli*_*bes 8

表达式体语法实际上只是属性和(命名)方法的较短语法,没有特殊含义。特别是,它与 lambda 表达式无关。

这两行是完全等价的:

public string Name => First + " " + Last;

public string Name { get { return First + " " + Last; } }
Run Code Online (Sandbox Code Playgroud)

您还可以编写表达式主体的方法(注意与您的 lambda 表达式执行相同操作的区别。在这里您指定返回类型和名称):

public int Square (int x) => x * x;
Run Code Online (Sandbox Code Playgroud)

代替

public int Square (int x)
{
    return x * x;
}
Run Code Online (Sandbox Code Playgroud)

您还可以使用它来编写 getter 和 setter

private string _name;
public Name
{
    get => _name;
    set => _name = value;
}
Run Code Online (Sandbox Code Playgroud)

对于构造函数(假设一个名为 的类Person):

public Person(string name) => _name = name;
Run Code Online (Sandbox Code Playgroud)

使用元组语法,您甚至可以分配多个参数

public Person(string first, string last) => (_first, _last) = (first, last);
Run Code Online (Sandbox Code Playgroud)

这也适用于分配给属性。

  • 是的。在某种程度上,他们为此选择了 lambda 运算符是一种耻辱。 (5认同)
  • 我同意这可能会令人困惑。 (4认同)

Chr*_*tos 5

表达体方法是语法糖。而不是写这个:

public string GetName()
{
    return First + " " + Last;
}
Run Code Online (Sandbox Code Playgroud)

你可以这样写:

public string GetName() => First + " " + Last;
Run Code Online (Sandbox Code Playgroud)

调用第一个或第二个的结果将完全相同。

各种表情体成员也是如此。

另一方面,这里正式声明的 lambda 表达式是:

可用于创建委托或表达式树类型匿名函数

话虽如此,很明显,尽管语法相似,但有两种完全不同的东西。