有些类型的成员确实以数据成员方式表现更好:例如客户名字,一个点的x,y坐标,或者去年的收入。属性可以让你创建像访问数据成员一样而且具有函数优势的接口。
。NET框架假定你会使用属性来访问公有数据成员。事实上,数据绑定代码类支持属性而不是公有数据成员。数据绑定将一个对象的属性和用户接口控件或者一个web控件或windows窗体控件联系起来。数据绑定机制使用反射来找到一个类型中具有某个名字的属性。
当你发现有新的需求或者行为的时候使用属性比公有数据成员的修改容易的多。你可能很快会决定你的客户类型应该永远不可能有空名字,如果使用属性,你可以很容易的在一个地方进行修正(set中进行判断,如果为空throw。。),如果使用公有数据成员,你将不得不在每个设置客户名字的地方进行修正
因为属性使用方法实现,添加多线程支持是很容易的,只要在get,set方法中配置以提供对数据的同步访问(lock)
属性具有方法的所有语言特点。属性可以声明为virtual
你也可以扩展属性为abstract甚至是一个接口定义的一部分
最后但绝不是不重要的一点,你可以使用接口创建一个接口的const和nonconst版本
属性语法扩展超越了简单的数据域。如果你的类型包含索引item作为它接口的一部分,你可以使用索引器
可以创建多维索引器
编译器对属性的访问和数据成员访问产生不同的MSIL。
虽然属性和数据成员是源码级兼容的,但在二进制级它们并不兼容。这意味着当你从一个公有数据成员变更到等价的共有属性的时候,你必须重新 编译所有使用公有数据成员的代码。
当看到属性的IL代码的时候,你可能怀疑属性和数据成员的相对性能。属性不会比数据成员访问更快,但属性也可以比数据成员一点都不慢。JIT编译器对一些方法进行内联调用,对属性访问器也进行内联调用。当JIT对属性访问器内联的时候,数据成员和属性的性能是相同的,即使属性访问器没有被内联,单个功能调用的实际性能差别也是可以忽略的,只有在极少数情况下才应当考虑
。NET框架假定你会使用属性来访问公有数据成员。事实上,数据绑定代码类支持属性而不是公有数据成员。数据绑定将一个对象的属性和用户接口控件或者一个web控件或windows窗体控件联系起来。数据绑定机制使用反射来找到一个类型中具有某个名字的属性。
当你发现有新的需求或者行为的时候使用属性比公有数据成员的修改容易的多。你可能很快会决定你的客户类型应该永远不可能有空名字,如果使用属性,你可以很容易的在一个地方进行修正(set中进行判断,如果为空throw。。),如果使用公有数据成员,你将不得不在每个设置客户名字的地方进行修正
因为属性使用方法实现,添加多线程支持是很容易的,只要在get,set方法中配置以提供对数据的同步访问(lock)
属性具有方法的所有语言特点。属性可以声明为virtual
你也可以扩展属性为abstract甚至是一个接口定义的一部分
最后但绝不是不重要的一点,你可以使用接口创建一个接口的const和nonconst版本
属性语法扩展超越了简单的数据域。如果你的类型包含索引item作为它接口的一部分,你可以使用索引器
可以创建多维索引器
编译器对属性的访问和数据成员访问产生不同的MSIL。
虽然属性和数据成员是源码级兼容的,但在二进制级它们并不兼容。这意味着当你从一个公有数据成员变更到等价的共有属性的时候,你必须重新 编译所有使用公有数据成员的代码。
当看到属性的IL代码的时候,你可能怀疑属性和数据成员的相对性能。属性不会比数据成员访问更快,但属性也可以比数据成员一点都不慢。JIT编译器对一些方法进行内联调用,对属性访问器也进行内联调用。当JIT对属性访问器内联的时候,数据成员和属性的性能是相同的,即使属性访问器没有被内联,单个功能调用的实际性能差别也是可以忽略的,只有在极少数情况下才应当考虑