概述
属性就是对于一个对象的抽象刻画[1] .
一个具体事物,总是有许许多多的性质与关系,我们把一个事物的性质与关系,都叫做事物的属性。
事物与属性是不可分的,事物都是有属性的事物,属性也都是事物的属性。
一个事物与另一个事物的相同或相异,也就是一个事物的属性与另一事物的属性的相同或相异。
由于事物属性的相同或相异,客观世界中就形成了许多不同的事物类。具有相同属性的事物就形成一类,具有不同属性的事物就分别地形成不同的类。
苹果是一类事物,它是由许多具有相同属性的个别事物组成的。梨也是一类事物,它也是由许多具有相同属性的个别事物组成的。苹果和梨是两个不同的类。苹果这个类的共同属性是不同于梨这个类的共同属性的。
属性和字段的区别
属性不能使用ref/out 型参数
属性使用前必须赋值
在C#中,我们可以非常自由的、毫无限制的访问公有字段,但在一些场合中,我们可能希望限制只能给字段赋于某个范围的值、或是要求字段只能读或只能写,或是在改变字段时能改变对象的其他一些状态,这些单靠字段是无法做到的,于是就有了属性,属性中包含两个块:set和get,set块负责属性的写入工作,get块负责属性的读取工作。在两个块中都可以做一些其他操作,如在set中验证赋的值是否符合要求并决定是否进行赋值。当缺少其中一块时属性就只能读或只能写,set和get块中属性必需有一个,因为即不能读又不能写的属性是没有意义的。
class MyClass { Private string name; public string Name { get {return Name;} set {Name=value;} } }
属性和函数的区别
相似点
都包含执行代码
都可以有访问修饰符
都可以有virtual, abstract, override 修饰符
都可以用在接口中不同点
属性只能拥有get/set 语句
属性不可以是void 型
属性不能使用参数
属性不能使用[ ] 参数
属性不能使用括号
访问器
get { //读属性代码 } set { //写属性代码 }
属性可以忽略get或set访问器,但是不能两个都忽略.
set访问器包含一个隐藏的参数value,该参数包含从客户代码传送过来的值.
公共属性及其底层类型最好使用相同的名称,因为它们之间的联系将很清晰.
字段使用camelCase(xxXxx),如dateOfBirth,而属性使用PacalCase(XxXxx),如DateOfBirth.一些开发人员喜欢在字段的开头使用下划线,如_Name,属性也应使用名词来命名.
c#通过属性特性读取和写入字段,而不直接读取和写入,以此来提供对类中字段的保护.
属性按可以访问的类型分为三种不同的类型:读/写属性
读/写属性是一个具有get()和set()访问器的属性.
语法: [访问修饰符] 数据类型 属性
{ get{ }; set{ }; }
只读属性
仅具有get()访问器属性称为只读属性.语法: [访问修饰符] 数据类型 属性名
{ get{ }; }
只写属性
仅具有set()访问器属性称为只写属性,不推荐使用只写属性.语法: [访问修饰符] 数据类型 属性名
{ set{ }; }
属性
充分体现了对象的封装性:不直接操作类的数据内容,而是通过访问器进行访问,即借助于get和set对属性的值进行读写;另一方面还可以对数据的访问属性进行控制(当然也可以通过对普通域加readonly关键字来实现。
设计原则:属性封装了对域的操作。把要访问的域设为private,通过属性中的get和set操作对域进行设置或访问。
不能把属性作为引用类型或输出参数来进行传递。
get方法没有参数;set方法有一个隐含的参数value。除了使用了abstract修饰符的抽象属性,每个访问器的执行体中只有分号“;”外,其他的所有属性的get访问器都通过return来读取属性的值,set访问器都通过value来设置属性的值。
采用间接方式来访问对象的属性(间接调用get、set方法):对象.属性 = 值(调用set),变量 = 对象.属性(调用get)。
在属性的访问声明中:
只有set访问器,表明该属性是只写的。
只有get访问器,表明该属性是只读的。
既有set访问器,又有get访问器,表明该属性是可读可写的。
总结
类的属性称为智能字段,类的索引器称为智能数组。
尽可能编写出运行效率更高,更健壮,更容易维护的C#代码。
尽可能的使用属性(property),而不是数据成员(field)