C#属性重构后get/set表达式体语法的含义咨询
嘿,我来给你掰扯清楚这个C#属性语法的变化哈!你提到的重构后的代码用的是C# 6.0引入的表达式体属性(Expression-bodied properties),和你原来的写法功能完全一致,就是官方推出的一种更简洁的语法糖而已。
先对比两种写法的对应关系
先把你前后的代码摆出来直观对比:
你原来的写法(显式字段+自动属性/传统属性)
public class MyClass { private string member1; public string Member1{ get; set; } }
这里补充个小细节:如果你的原代码是直接写{ get; set; }的自动属性,编译器会自动帮你生成一个幕后的私有字段;而重构后是你显式声明了member1这个私有字段,再用表达式体语法把属性的get/set和它关联起来,其实是把自动属性展开成了显式字段+属性的写法,只是用了新的简化语法。
重构后的表达式体写法
public class MyClass { private string member1; public string Member1 { get => member1; set => member1 = value; } }
表达式体语法的具体含义
咱们拆开来逐个看:
get => member1:这是get访问器的简化写法,完全等价于传统的:get { return member1; }这里的箭头
=>就代表“返回后面表达式的值”,省去了大括号和return关键字,让代码更紧凑清爽。set => member1 = value;:这是set访问器的简化写法,等价于传统的:set { member1 = value; }箭头后面就是要执行的赋值语句,
value是set访问器的隐式参数,和你原来写法里的value完全是同一个东西,用来接收外部传入的赋值内容。
为啥VS2017会建议这个重构?
VS2017已经全面支持C# 6.0及以上的语法,这种表达式体写法是官方推荐的简洁编码风格,尤其是当你的get/set逻辑很简单(只是返回字段或者给字段赋值)的时候,用这种写法能减少冗余代码,让类的结构看起来更清晰。
关键提醒
这种写法和传统写法功能100%一致,编译后的底层IL代码完全相同,所以你完全不用担心会影响原有功能,只是写法上的优化而已。而且这种表达式体语法还能扩展用到方法、构造函数、索引器等场景中(C#后续版本还进一步扩展了它的适用范围)。
内容的提问来源于stack exchange,提问作者Jennifer Bartolome

