我看到一些代码说
public int MaxHealth =>
Memory[Address].IsValid ?
Memory[Address].Read<int>(Offs.Life.MaxHp) :
0;
现在我对Lambda表达式有点熟悉了。我只是没见过它这样使用。
上述陈述和两者之间的区别是什么
public int MaxHealth = x ? y:z;
我看到一些代码说
public int MaxHealth =>
Memory[Address].IsValid ?
Memory[Address].Read<int>(Offs.Life.MaxHp) :
0;
现在我对Lambda表达式有点熟悉了。我只是没见过它这样使用。
上述陈述和两者之间的区别是什么
public int MaxHealth = x ? y:z;
当前回答
它被称为表达式体成员,是在c# 6中引入的。它只是get only属性上的语法修饰。
它相当于:
public int MaxHealth { get { return Memory[Address].IsValid ?
Memory[Address].Read<int>(Offs.Life.MaxHp) : 0; }
一个等效的方法声明是可用的:
public string HelloWorld() => "Hello World";
主要是让你缩短样板。
其他回答
它被称为表达式体成员,是在c# 6中引入的。它只是get only属性上的语法修饰。
它相当于:
public int MaxHealth { get { return Memory[Address].IsValid ?
Memory[Address].Read<int>(Offs.Life.MaxHp) : 0; }
一个等效的方法声明是可用的:
public string HelloWorld() => "Hello World";
主要是让你缩短样板。
如果你使用的是c# 6,还有一点很重要:
'=>'可以用来代替'get',并且只用于'get only'方法-它不能与'set'一起使用。
对于c# 7,请看下面来自@avenmore的评论——它现在可以在更多的地方使用。这里有一个很好的参考- https://csharp.christiannagel.com/2017/01/25/expressionbodiedmembers/
以下是亚历克斯·布克在他们的回答中分享的声明
当编译器遇到表达式体的属性成员时,它本质上是将其转换为这样的getter:
请看下面的截图,它展示了这个语句(使用SharpLab链接)
public string APIBasePath => Configuration.ToolsAPIBasePath;
皈依
public string APIBasePath
{
get
{
return Configuration.ToolsAPIBasePath;
}
}
截图:
你也可以使用箭头作为get访问器:
private string foo = "foo";
private string bar
{
get => $"{foo}bar";
set
{
foo = value;
}
}
=>语法等于get {return…}语法。
string MyString { get; } = "value";
不一样吗
string MyString => "value";
尽管在这种情况下它们返回相同的值。观察下面的两个例子。
区别就在这里。 例1将在每次读取属性时返回相同的Person。
例2将在每次读取属性时返回一个新的Person。
//Ex: 1
public Person Person { get; } = new Person();
//Ex: 1
//Is the same as
private readonly Person person = new Person();
public Person Person
{
get { return person; }
}
和…
//Ex: 2
public Person Person => new Person();
//Ex: 2
//Is the same as
public Person Person
{
get { return new Person(); }
}
当您使用自动初始化式时,该属性将创建value的实例并持久地使用该值。在上面的帖子中,有一个关于比尔·瓦格纳的坏链接,这解释得很好,我自己搜索了正确的链接来理解它。
在我的情况下,我有我的属性auto初始化一个命令在一个ViewModel的视图。我将属性更改为使用表达式体初始化器,命令CanExecute停止工作。
这是它的样子,这是发生的事情。
Command MyCommand { get; } = new Command(); //works
这是我改的。
Command MyCommand => new Command(); //doesn't work properly
这里的区别是当我使用{get;我在该属性中创建并引用同一个命令。当我使用=>时,我实际上创建了一个新命令,并在每次调用属性时返回它。因此,我永远无法更新我的命令上的CanExecute,因为我总是告诉它更新该命令的新引用。
{ get; } = // same reference
=> // new reference
尽管如此,如果你只是指向一个支持字段,那么它工作得很好。这只在auto或表达式体创建返回值时发生。