外观
关于属性初始化器 (Property initializer)
public class Mycls
{
public int SampleType { get; set; } = 1;
//正常
public string SampleTypeStr => SampleType==1 ? "是" : "否";
//错 不能同时提供程序块主体与表达式主体。
public string SampleTypeStr2 { get; } => SampleType==1 ? "是" : "否";
//错 字段初始值设定项无法引用非静态字段、方法或属性“SlideInfo.SampleType”
public string SampleTypeStr1 { get; } = SampleType==1 ? "是" : "否";
}- 第一种 表达式主体属性
- 表达式主体属性:C#6.0引入 相当于一个只读属性(只有get,没有set),每次访问它时,都会执行右边的表达式计算返回值。
- 他在每次读取时计算
- 展开其实就是一个函数 有方法体的
- 第二种 自读自动属性
- 在字段初始化阶段就计算
- 也有方法体
- 第三种 自读自动属性
- 在字段初始化阶段就需要计算
所以为什么第二、三种会错误
- 第二种
- 他拥有了
{ get; }又给了他一个 => 相当于这个属性有了2个方法体 自然报错 - 于是颜色第三种 我不用 => 又怎么样呢
- 他拥有了
- 第三种
- 自动属性初始值设定项 但是用了=号赋值
- 表达式里用了SampleType,而 SampleType 是实例字段/属性(非 static)。C# 规定:字段或自动属性的初始值设定项(用 = 赋值的那部分)只能用常量、静态成员或者简单的新对象等,不能引用同一个类的其他实例成员。
- 相当于对象在创建的时候,实例字段的初始化是从上到下依次执行的,这时候“当前对象”(this)还没完全建好。所以读不到其他属性
