C#中属性 get和set访问器

来源:互联网 发布:综合素质答题技巧知乎 编辑:程序博客网 时间:2024/04/24 12:12

属性

学得越多,就会对其更深入的东西更感兴趣。
写下东西让自己的理解更为深刻,这不失为一个好的学习的方法!
读书做精要部分的笔记,这更能理解所学的东西。有时候还能翻出来看看!

使用访问方法是一种不错的技术,几种面向对象语言(包括C++和JAVA)都是使用这种技术,但是C#提供了一种更为丰富的机制:属性。属性具有访问方法一样的能力,而且在客户端看起来像字段。
属性是一种用于访问对象或类的特性的成员,在目前的学习中,觉得和方法有多少相似的地方。属性是字段的自然扩展,两者都具有关联类型的命名成员,而且访问字段和属性的语法是相同的。属性和字段的不同的是字段代表存储位置,而属性没有。属性有字段所没有的,就是访问器,访问器指定在它们的值被读取或者写入时所需及执行的语句。

1.属性的声明
总的来说,我们只要注意属性声明或者在使用是的一些规定就可以了,还有最为重要的:属性的操作过程。
声明是用如下语法:

类型 属性名 {访问器声明}

注意:属性还可以跟方法一样有参数,当然限制的是,参数必须是值参数外,参数的列表的声明与方法的一样。
访问器包括包含get访问器set访问器

2.get访问器
get访问器相当于一个无参数方法,该方法具有属性类型的返回值以及属性相同的修饰符,而执行get访问器就是相当于读取了字段的值。需要注意的是,在get访问器中,返回值作为属性值提供给调用表达式。
例如:
private int a ;public int A{    get{return a;}}

注意:当引用属性时,除非该属性为赋值目标,否则将调用get访问器读取该属性的值。(在没看到上面这句话之前,我也很疑惑,调用时怎么让对象知道是get呢,还是set呢?


 

3.set访问器
set访问器相当于一个void方法,该方法具有单个属性类型的值参数,以及包含属性相同的修饰符。
在set访问器中,新的属性值通过set访问器的参数传递。值得注意的是,在通过新的属性值赋值给字段时,显示参数传递必须声明为与该属性相同的数据类型,当然也可以使用隐式参数,不加声明时,编译器将使用隐式参数Value来表示赋给属性的新值。set访问器隐式具有名为value的参数(value),此参数的类型是属性的类型。
例如:
private int a ;public int A{    set{a=value;} }
属性按如下方式,根据所使用的访问器进行分类:
  • 只带有get访问器的属性称为只读属性。无法对只读属性赋值。
  • 只带有set访问器的属性称为只写属性。只写属性除作为赋值的目标外,无法对其进行引用。
  • 同时带有get和set访问器的属性为读写属性!
注意:在属性声明时,get和set访问器都必须在属性体内部声明。
4.调用get访问器在概念上等效于读取字段的值。但是并不是单单被编写成只有返回存储在字段中的值,事实上可以通过访问多个字段的值来计算出用户所需要的值,然后作为返回值,返回调用的表达式。
例如:
private int a ;private int b ;public int AAA{    get{return (a*b/10)}}
5.set访问器也不始终被编写为只修改字段的值,事实上,set访问器经常提供验证代码以防不正确的更新了私有字段的值。
更新的值可能是通过访问多个字段或者调用方法计算出的值。
例如加上些判断语句判断所传入的值是否正确。
private int a ;public int AAA{    set        {            if(value > 0) a = value; //通过验证是否符合正确的数据            else  a = 0;        }}
6.属性没有存储位置。并不意味着需要为每个属性都声明一个字段,有些事存在关联的。例如属性AAA的值是属性BBB的值的10倍,那么只要声明一个字段描述AAA属性的字段,或者是BBB属性的字段即可。

7.属性允许对象保护和验证自己的数据。通过属性来获取和设置字段的值,可以确保字段的值是正确的,例如,有两个逻辑上关联的字段,假设为:
Hours=2
Miutes= 120    (且Hours*60=Miutes)
如果在用户直接访问这两个字段,且 修改了其中某个数值,造成逻辑上的错误,那么就会造成错误的结果。如果是在某属性上设置逻辑的语句去修改或者判断,那么就能保证两个字段不会出现逻辑上的错误。
PS:属性不会被分配任何存储位置,属性的值被存储在字段中,当给属性赋值时,用来存储状态的字段的值就会改变,以反映所指定的新值。读取属性的值就从字段读取值,并把当前的值返回给调用者。

努力~~~~~~~~~~~
努力~~~~~~~
努力~~~