标签:知新树 宁金峰
属性是用来描述类的特征;
[public] class 类名
{
字段;
属性;
方法;
}
类需要实例化后才能使用,但我们是通过属性来访问类中的字段;字段是是用来存储数据的;
属性的作用就是代替字段与外界打交道,从而起到保护字段的作用。它的本质就是两个方法,一个get()一个set();
从他们的字面意思可以看出,一个可读一个可写,并不是所有的属性都是同时有get set方法的;
在类进行实例化后,对类中的属性赋值,首先会执行属性中的set方法,对属性进行打印输出的时候
会执行属性中的get()方法;
属性值的定义举例:
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
private int _age;
public int Age
{
get;
set;
}
补充说明:当给属性赋值的时候会调用Set方法,此时value的值就是属性接收的值;
当取出属性值的时候会调用Get方法,其实就是把字段的值取出给属性;
我们同样可以在set中对传进来的值进行判断,定义特定条件下的返回值
class A {
private int age;
public int Age
{
get { return age; }
set
{
if (value < 0)
{
throw new ArgumentOutOfRangeException("Age must be greater than or equal to 0");
}
age = value;
}
}
public void Fun() {
Age = -10;
//如果写的时age = -10;就不会报错,因为所做的判定时针对于Value的,它是C#中提供的关键字,代表的就是你赋给该属性的真正的值。而不是字段的值。
}
调用时:
static void Main(string[] args)
{
A a = new A();
a.Fun();
Console.WriteLine(a.Age);
Console.ReadKey();
}
运行时会弹出异常。
上面的代码中,throw语句的作用是抛出一个异常,我们暂时可以不去理会它,而是将注意力放到get和set访问器上。首先,我们定义了一个私有字段age,然后再定义一个公共属性Age。在该属性中,get返回私有字段的值age,而在set中,首先会判断value的值,如果小于0,那么这个值是非法的,就将抛出一个异常,停止往下执行,并告诉你对Age值的设置错误了。当然,我们也可以为value值设置更严格的要求,
user.Age = 30;
此时是对Age属性赋值,.Net会执行set访问器,而value值就是30。然后判断30是否小于0。显然不符合条件,不会抛出异常,继续执行,将value值30赋给字段age。为什么要赋给age呢?让我们再看看get访问器,它其实就是一个读操作,返回的值是什么?对了,就是字段age,如下所示:
user.Age = 30; //set操作,将字段age设置为30;
Console.WriteLine(“User’s Age is {0}.”, user.Age); //get操作,将m_age的值取出;
此时就会在控制台下显示:
User’s Age is 30.
此外,对于一些特殊的要求,我们在将字段封装为属性时,可以只设置它的get访问器或者set访问器,这样这个属性就是只读属性,或者只写属性了。这样显然更有利于对象的封装。毕竟对于公共字段而言,我们最能可以控制它为只读(设置为readonly),却无法设置为只写。
从上可以看到,实际上属性就是对字段进行一次封装。通过这个封装,使我们对字段age的读写都具有了控制功能。
本文出自 “13233523” 博客,请务必保留此出处http://13243523.blog.51cto.com/13233523/1979895
标签:知新树 宁金峰
原文地址:http://yangleitse.blog.51cto.com/2336747/1979895