自动属性

5 本我 1天前 46次点击

重构功能肯定加快了键入速度,不过除此以外,C#另外提供了一种方式:自动属性。对于自动属性,可以用简化的语法声明属性,C#编译器会自动添加未键入的内容。确切地讲,编译器会声明一个用于存储属性的私有字段,并在属性的get和set块中使用该字段,我们不必考虑细节。

使用下面的代码结构就可以定义一个自动属性:

public int MyIntProp

{

get;

set;

}

甚至可以在一行代码上定义自动属性,以便节省空间,而不会过度地降低属性的可读性:

public int MyIntProp { get; set; }

我们按照通常的方式定义属性的可访问性、类型和名称,但没有给get和set块提供实现代码。这些块的实现代码(和底层的字段)都由编译器提供。

注意:

使用Visual Studio中的支持代码片段,可以创建一个自动实现的属性模板。输入prop后按Tab键两次,就会自动创建public int MyProperty {get; set; }。

使用自动属性时,只能通过属性访问数据,不能通过底层的私有字段来访问,因为我们不知道底层私有字段的名称(该名称是在编译期间定义的)。但这并不是一个真正意义上的限制,因为可以直接使用属性名。自动属性的唯一限制是它们必须包含get和set存取器,无法使用这种方式定义只读或只写属性。但可以改变这些存取器的可访问性。例如,可采用如下方式创建一个外部只读属性:

public int MyIntProp { get; private set; }

此时,只能在类定义的代码中访问MyIntProp的值。

C# 6引入了两个与自动属性相关的新概念:只有get存取器的自动属性,和自动属性的初始化器。在C# 6之前,自动属性需要set存取器,来限制不变数据类型的使用。不变数据类型的简单定义是,一旦创建,就不会改变状态。最著名的不变类型是System.String。使用不变的数据类型有很多优点,比如简化了并发编程和线程的同步。

并发编程和线程的同步是高级主题,这里不进一步讨论。然而一定要知道只有get存取器的自动属性。它们使用以下语法创建,注意不再需要set存取器:

public int MyIntProp { get; }

自动属性的初始化功能由以下声明字段的方式实现:

public int MyIntProp { get; } = 9;

目前还没有评论
添加一条新评论

登录后可以发表评论 去登录