C# 表达式体成员与Lambda表达式

C# 表达式体成员与Lambda表达式,c#,lambda,expression-body,C#,Lambda,Expression Body,lambda表达式是作为对象处理的代码块(表达式或语句块)。它可以作为参数传递给方法,也可以通过方法调用返回 看着这句话,我想知道使用lambdas和使用Expression bodied有什么区别 public string Name => First + " " + Last; 表达式体语法实际上只是属性和(命名)方法的较短语法,没有特殊意义。特别是,它与lambda表达式无关 这两条线完全相等: public string Name => First + " &qu

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

看着这句话,我想知道使用lambdas和使用Expression bodied有什么区别

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

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

这两条线完全相等:

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

public string Name { get { return First + " " + Last; } }
您还可以编写表达式体方法(注意与lambda表达式相同的不同之处。在这里,您可以指定返回类型和名称):

而不是

public int Square (int x)
{
    return x * x;
}
您还可以使用它来编写getter和setter

private string _name;
public Name
{
    get => _name;
    set => _name = value;
}
对于构造函数(假设一个名为
Person
的类):

使用元组语法,您甚至可以指定几个参数

public Person(string first, string last) => (_first, _last) = (first, last);

这也适用于指定属性。

表达式体方法是语法糖。而不是写这封信:

public string GetName()
{
    return First + " " + Last;
}
你可以这样写:

public string GetName() => First + " " + Last;
调用第一个或第二个的结果将完全相同

同样的道理也适用于所有的类型

另一方面,正式声明的lambda表达式为:

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


尽管如此,很明显,尽管语法上有相似之处,但有两个完全不同的东西。

一个是委托,另一个是属性。我相信
Name=>“
将隐式成为
get return
语句当lambda表达式首次引入时,它们可以用于表示内嵌委托或表达式。委托就像函数指针当你调用委托时,你调用委托所代表的代码。表达式表示抽象代码。当您使用Linq2SQL或Entity Framework时,您在where子句中使用的lambda表示不在C#程序上下文中执行的谓词代码,它表示在数据库服务器上执行的代码。因此,表达式体表示抽象代码,在本例中用于实现propYeah。在某种程度上,这是一种耻辱,他们增选了lambda运营商。我同意,这可能会令人困惑。
public Person(string first, string last) => (_first, _last) = (first, last);
public string GetName()
{
    return First + " " + Last;
}
public string GetName() => First + " " + Last;