C# 自动属性
属性是访问对象状态的首选方式,因为它们禁止外部代码访问对象内部的数据存储机制的实现。属性还对内部数据的访问方式施加了更多控制,本章代码在多处体现了这一点。但是,一般以非常标准的方式定义属性,即通过一个公共属性来直接访问一个私有成员。其代码非常类似于上一节的代码,这是Visual Studio重构工具自动生成的。
重构功能肯定加快了键入速度,不过除此以外,C#另外提供了一种方式:自动属性。对于自动属性,可以用简化的语法声明属性,译器会自动添加未键入的内容。确切地讲,编译器会声明一个用于存储属性的私有字段,并在属性的get和set块中使用该字段,我们不必考虑细节。
使用下面的代码结构就可以定义一个自动属性:
public int MylntProp
{
get;
set;
}
甚至可在—行代码上定义自动属性,以便节省空间,而不会过度地降低属性的可读性:
public int MylntProp { get; set; }
我们按照通常的方式定义属性的可访问性、类型和名称,但没有给get或set块提供实现代码。这些块的实 现代码(和底层的字段)都由编译器提供。
使用自动属性时,只能通过属性访问数据,不能通过底层的私有字段来访问,因为我们不知道底层私有字段的名称(该名称是在编译期间定义的)。但这并不是一个真正意义上的限制,因为可以直接使用属性名。自动属性的唯一限制是它们必须包含get和set访问器,无法使用这种方式定义只读或只写属性。但可以改变这些访问器的可访问性。例如,可采用如下方式创建一个外部只读属性:
public int MylntProp { get; private set; }
此时,只能在类定义的代码中访问MylntProp的值。
C#6引入了两个与自动属性相关的新概念:只有get访问器的自动属性,和自动属性的初始化器。在C#6之前,自动属性需要set访问器,来限制不变数据类型的使用。不变数据类型的简单定义是,一旦创建,就不会改变状态。最著名的不变类型是SysteuLString。使用不变的数据类型有很多优点,比如简化了并发编程和线程的同步。
并发编程和线程的同步是高级主题,本书不进一步讨论。然而一定要知道只有get访问器的自动属性。它 们使用以下语法创建,注意不再需要set访问器:
public int MylntProp { get; }
自动属性的初始化功能由以下声明字段的方式实现:
public int MylntProp { get; } = 9;
点击加载更多评论>>