属性签名中C#中的=>赋值是什么

属性签名中C#中的=>赋值是什么,第1张

属性签名中C#中的=>赋值是什么

您正在查看的是表达式健全的成员, 而不是lambda表达式。

当编译器遇到表达式表达式 属性 成员时,它实际上将其转换为如下所示的getter:

public int MaxHealth{    get    {        return Memory[Address].IsValid ? Memory[Address].Read<int>(Offs.Life.MaxHp) : 0;    }}

(您可以通过将代码注入到一个名为TryRoslyn的工具中来自己验证这一点。)

像大多数C#6功能一样,表达强壮的成员 只是
语法糖。这意味着它们不会提供通过现有功能无法实现的功能。相反,这些新功能允许使用更具表现力和简洁的语法

如您所见,表达式健全的成员具有一些使属性成员更加紧凑的快捷方式:

  • 不需要使用
    return
    语句,因为编译器可以推断出您要返回表达式的结果
  • 由于主体只是一个表达式,因此无需创建语句块
  • 无需使用
    get
    关键字,因为使用表达式主体成员语法隐含了该关键字。

我把最后一点加粗了,因为它与您的实际问题有关,我现在将回答。

和…之间的不同…

// expression-bodied member propertypublic int MaxHealth => x ? y:z;

和…

// field with field initializerpublic int MaxHealth = x ? y:z;

与…之间的区别相同

public int MaxHealth{    get    {        return x ? y:z;    }}

和…

public int MaxHealth = x ? y:z;

如果您了解属性,则应该显而易见。

不过,要清楚一点:第一个清单是一个带有引擎盖下的吸气剂的属性,每次访问它时都会调用它。第二个清单是带有字段初始值设定项的字段,当实例化类型时,其表达式仅计算一次。

语法上的这种差异实际上非常微妙,并且可能导致“陷阱”,这由Bill Wagner在标题为
AC#6陷阱:初始化vs.身体强壮的成员”中描述


虽然表达式强成员是lambda expression- like ,但它们 不是
lambda表达式。根本区别在于,lambda表达式会导致委托实例或表达式树。表达式主体成员只是编译器的指令,可在后台生成属性。相似度(或多或少)以箭头(

=>
)开始和结束。

我还要补充一点,表达体成员不仅限于属性成员。他们在所有这些成员上工作:

  • 物产
  • 索引器
  • 方法
  • 经营者

在C#7.0中添加

  • 建设者
  • 终结者

但是,它们不适用于以下成员:

  • 嵌套类型
  • 大事记
  • 领域


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5567581.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-14
下一篇 2022-12-14

发表评论

登录后才能评论

评论列表(0条)

保存