自动属性
一般情况下,类的设计都只会对外公开属性。
为了考虑到以后可能添加限制。
即便在开始设计的时候还不知道要添加什么限制。
所以开始的时候,一个属性往往长成这样:
class Monster
{
int hp;
public int Hp { get => hp; set => hp = value; }
}
不经过任何逻辑处理,只是为了留给以后扩展。
对于这种情况,提供了一种简写方式,这称为自动实现属性。
class Monster
{
public int Hp { get; set; }
}
在get访问器后直接用分号结尾,不加任何逻辑。
可以没有set或init访问器,但如果有,则他们也需要以分号结尾,不能添加逻辑。
如果需要后续修改,只需要修改这个属性的访问器就行了。
由于没有代码访问到他所控制的字段,全是访问到这个属性本身。
所以很容易修改。
匿名字段初始值
自动属性所管理的字段称为匿名字段。这是编译器在编译时添加的。
因为没有名字,所以你无法在代码里访问。
这种情况下提供了一种特殊的语法,用来给你修改初始值。
在大括号后面使用等号进行赋值,并在后面加分号。
class Monster
{
public int Hp { get; set; } = 20;
public int MaxHp { get; } = 100;
}
单独的访问器访问权限
自动实现属性和普通的字段相比,还有另一个区别。
由于get和set是两个不同的方法,所以可以有两个不同的访问权限。
而其中一个较大的访问权限声明在了属性前面。
另一个较小的访问权限声明在访问器前面。
class Monster
{
public int Hp { get; private set; } = 20;
public int MaxHp { get; } = 100;
}
这样一来,这个属性在外部是只读属性。
而在类的内部可读可写。
访问器权限并不是自动属性特有的功能,普通属性也可以使用。