条款一 : 使用属性代替可访问的数据成员
2008-05-07 16:38
357 查看
在c#中,属性(property)是这样一种语言元素,它们在被访问的时候看起来好像是数据成员,但是它们却是用方法实现的。
有时候,一些类型成员最好的表示形式就是数据。例如一个客户的名字。使用属性我们可以创建一种特殊的接口------这种接口在行为上像数据访问,但却仍能获得函数的全部好处。客户代码对属性的访问就像访问公有变量一样。但实际的实现采用的却是方法,这些方法内部定义了属性访问器的行为。
.NET框架中的数据绑定类只支持属性,而不支持公有数据成员,这些数据绑定类会将对象的属性关联到用户界面控件上。其数据绑定机制事实上是使用反射来查找一个类型中具有特定名称的属性。例如:
textBoxCity.DataBindings.Add("Text",address,"City");
便是将textBoxCity控件的Text属性和address对象的City属性绑定在一起。
当然,数据绑定类所应有的类一般都要和用户界面打交道。但这不意味着属性只在UI逻辑中有用武之地。对于其它类的结构,我们也需要使用属性。随着时间的推移,新的需求或行为往往会影响原来类型的实现,采用属性比较容易能够应对这些变化。例如,我们可能很快会发现Customer类不能 有一个空的Name。如果我们使用一个公开属性来实现Name,那么只需要在一个地方做更改即可。
1public class Customer
2public string Name
public class Customer
public interface INameValuePair
最后,我们还可以借助属性的特点来创建const和非const版本的接口:
public interface IConstNameValuePair
public interface INameValuePair
public class Stuff : IConstNameValuePair,INameValuePair
属性在C#中已经成为一项比较完善的、第一等的语言元素。我们可以针对成员函数做的任何事情,对于属性也同样适用。毕竟,属性是对访问/修改内部数据的方法的一种扩展。
我们知道,属性访问器在编译后事实上是两个分离的方法。在C#2.0种,我们可以为一个属性的get访问器和set访问器指定不同的访问修饰符。这使得我们可以更好的控制属性的可见性。
public class Customer
C#的属性语法扩展自简单的数据字段。如果类型接口需要包含一些索引数据项,则可以使用一种称作索引器(indexer)的类型成员。索引器在C#中又称含参属性(parameterized property)。这种“使用数下来返回一个序列中的数据项”的做法对于很多场合非常有用,下面的代码展示了这一用法:
public int this[int index]
综上所述,只要打算将数据暴露在类型的公有接口或受保护接口中,我们都应该使用属性来实现。对于具有序列或者字典特征的类型,则应该采用索引器。所有的数据成员都应该一律声明为私有。使用属性的好处显而易见:我们可以得到更好的数据绑定支持,我们可以更容易的在将来对其访问访问方法的实现做任何改变。
有时候,一些类型成员最好的表示形式就是数据。例如一个客户的名字。使用属性我们可以创建一种特殊的接口------这种接口在行为上像数据访问,但却仍能获得函数的全部好处。客户代码对属性的访问就像访问公有变量一样。但实际的实现采用的却是方法,这些方法内部定义了属性访问器的行为。
.NET框架中的数据绑定类只支持属性,而不支持公有数据成员,这些数据绑定类会将对象的属性关联到用户界面控件上。其数据绑定机制事实上是使用反射来查找一个类型中具有特定名称的属性。例如:
textBoxCity.DataBindings.Add("Text",address,"City");
便是将textBoxCity控件的Text属性和address对象的City属性绑定在一起。
当然,数据绑定类所应有的类一般都要和用户界面打交道。但这不意味着属性只在UI逻辑中有用武之地。对于其它类的结构,我们也需要使用属性。随着时间的推移,新的需求或行为往往会影响原来类型的实现,采用属性比较容易能够应对这些变化。例如,我们可能很快会发现Customer类不能 有一个空的Name。如果我们使用一个公开属性来实现Name,那么只需要在一个地方做更改即可。
1public class Customer
2public string Name
public class Customer
public interface INameValuePair
最后,我们还可以借助属性的特点来创建const和非const版本的接口:
public interface IConstNameValuePair
public interface INameValuePair
public class Stuff : IConstNameValuePair,INameValuePair
属性在C#中已经成为一项比较完善的、第一等的语言元素。我们可以针对成员函数做的任何事情,对于属性也同样适用。毕竟,属性是对访问/修改内部数据的方法的一种扩展。
我们知道,属性访问器在编译后事实上是两个分离的方法。在C#2.0种,我们可以为一个属性的get访问器和set访问器指定不同的访问修饰符。这使得我们可以更好的控制属性的可见性。
public class Customer
C#的属性语法扩展自简单的数据字段。如果类型接口需要包含一些索引数据项,则可以使用一种称作索引器(indexer)的类型成员。索引器在C#中又称含参属性(parameterized property)。这种“使用数下来返回一个序列中的数据项”的做法对于很多场合非常有用,下面的代码展示了这一用法:
public int this[int index]
综上所述,只要打算将数据暴露在类型的公有接口或受保护接口中,我们都应该使用属性来实现。对于具有序列或者字典特征的类型,则应该采用索引器。所有的数据成员都应该一律声明为私有。使用属性的好处显而易见:我们可以得到更好的数据绑定支持,我们可以更容易的在将来对其访问访问方法的实现做任何改变。
相关文章推荐
- 条款1:使用属性代替可访问的数据成员(转)
- 条款1:使用属性代替可访问的数据成员
- Item 1: 尽可能的使用属性代替可访问的数据成员(Always Use Properties Instead of Accessible Data Members)
- 提高C#编程水平的50个要点 1.总是用属性 (Property) 来代替可访问的数据成员 2.在 readonly 和 const 之间,优先使用 readonly 3.在 as 和 强制类型转换之
- 提高C#编程水平的50个要点 之一“总是用属性 (Property) 来代替可访问的数据成员(field)”
- 1.总是用属性 (Property) 来代替可访问的数据成员(field)
- 1、永远使用属性替代可访问的数据成员
- Effective c# Item1:总是使用属性替代可访问的数据成员
- Effective C#阅读笔记-1.使用属性(Properties)代替数据成员(Data Member)
- 【C#高效编程50例】条目1:使用属性而不是可访问的数据成员
- 《Effective C#》读书笔记——条目1:使用属性而不是可访问的数据成员<C#语言习惯>
- 改善 C# 的语言习惯(一) - 使用属性而不是可访问的数据成员(整理中)
- Effective C#:Item1:使用属性而不是可访问数据成员
- 使用属性代替可访问的成员变量
- Effective C# 原则1:尽可能的使用属性(property),而不是数据成员(field)
- 使用成员函数访问私有数据成员
- 3第一周课后练习·阅读计划(3)-使用函数来访问私有数据成员
- 使用表达式树访问对象、类型及成员(下):获取对象和属性的值
- 使用属性——避免将数据成员直接暴露给外界
- 3第一周课后练习·阅读计划(2)-使用指针来访问私有数据成员