Skip to content

关于属性初始化器 (Property initializer)

约 436 字大约 1 分钟

NET

2025-12-18

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)还没完全建好。所以读不到其他属性