C# 属性和字段
可以通过属性和字段访问对象中包含的数据。这些对象数据可以用于区分不同的对象,因为同一个类的不同对象在属性和字段中存储了不同的值。
包含在对象中的不同数据构成了对象的状态。假定一个对象类表示一杯咖啡,称为CupOfCoffee。在实例化这个类(即创建这个类的对象)时,必须提供对类有意义的状态。此时可以使用属性和字段,让代码能通过该对象设置要使用的咖啡品牌,咖啡中是否加牛奶或方糖,咖啡是否即溶等。于是,给定的这杯咖啡对象就有了指定的状态,例如,加牛奶和两块方糖的哥伦比亚过滤咖啡。
字段和属性都可以键入,所以可将信息存储在字段和属性中,作为string值、int值等。但属性与字段是不同的,因为属性不提供对数据的直接访问。对象能让用户不考虑数据的细节,不需要在属性中用一对一的方式表示。如果在CupOfCoffee实例中使用一个字段来表示方糖的数量,用户就可以在该字段中放置自己喜欢的值,其取值范围仅由存储该信息的类型来限制。例如,如果使用int来存储这个数据,用户就可以使用-2 147 483 648至2 147 483 647之间的任意值,如第3章所述。显然,并不是所有的值都有意义,尤其是负值,一些较大的正值将需要非常大的咖啡杯。但如果使用一个属性来表示,就可以限制这个值,例如介于0和2之间的一个数字。
一般情况下,在访问状态时最好提供属性而不是字段,因为这样可以更好地控制各种行为,这个选择不会影响使用对象实例的代码,因为使用属性和字段的语法是相同的。对属性的读写访问也可以由对象来明确定义。某些属性是只读的,只能查看它们的值,而不能改变它们(至少不能直接改变)。这常常是同时读取几个状态的一个有效技巧。CupOfCoffee类有一个只读属性Description,在请求它时,就返回一个字符串,表示该类的一个实例的状态(例如前面给出的字符串)。也可以通过查看几个属性,把相同的数据组合起来,但这样的属性可以节省时间和精力。还可以有只写的属性,其操作方式是类似的。
除了对属性的读/写访问外,还可以为字段和属性指定另一种访问权限,称为可访问性。可访问性确定了什么代码可以访问这些成员,它们可用于所有代码(公共)还是只能用于类中的代码(私有),或者使用更复杂的模式。常见的情况是把字段设置为私有,通过公共属性访问它们。这样,类中的代码就可以直接访问存储在字段中的数据,而公共属性禁止外部用户访问这些数据,以防外部用户在其中放置无效的内容。公共成员是类公开的成员。
要更清晰地阐明这个问题,可以把可访问性与变量的作用域等同起来。例如,私有字段和属性可以看成拥有它们的对象的局部成员,而公共字段和属性的作用域也包括对象以外的代码。
点击加载更多评论>>