get与set属性
get属性 set属性
就直接分析程序吧,如下有三段程序,三个程序都是在某一个类中。
//程序1
public string name;
//程序2
public string name{get;set;}
//程序3
private string name;
public string Name;
{
set{name = value;}
get{return name;}
}
- 程序1
这个比较简单易懂,直接就是类中的一个共有的数据成员。可以直接通过类的对象进行初始化后,然后进行调用。
- 程序2
第一眼看的时候会比较蒙,get与set的作用是啥,这是个什么用法。我都有点怀疑自己了,当遇到这个的时候。不过一番了解后,就知道了。简单点说,如下:
- 程序2与程序1在使用的作用是一样的。其中的get与set是name数据成员的两个属性
为什么,第一个没有呢?
- 第一个类型的name属性未封装,其name属性直接通过public关键字暴露给系统中的其他类
- 第二个类型的name属性通过get set关键字进行了封装,get和set分别对应的是可读和可写
也就是说,每个数据成员都是具有get与set属性的。在默认没有显示的设置的时候,默认就是个可读与可写的。而程序2的写法就对其进行了显示的表达,两者在使用上没有区别。
但是如果将程序2,进行一个小的修改:
//程序2-修改1
public string name{get;}
//程序2-修改2
public string name{set;}
修改后,name数据成员将与程序1中的name有所区别。
- 修改1:name只能可读,将不能修改其值。
- 修改2:name的属性就是只能进行写入
再来说说程序3的作用
//程序3
private string name;
public string Name
{
set{name = value;}
get{return name;}
}
- 私有数据成员是name,而Name是一个属性。对name数据成员进行保护的
可能有疑问的是,value没有进行定义,为什么可以直接进行使用呢?
- 在用set时有一个特殊的变量value 就是设置属性时的值
- value 隐式参数,用于设置访问器以及添加或移除事件处理程序。
这样一来问题就解决了。这三个程序之间的区别也就区分开来了。在实际的使用中,应该对数据成员都会有一个相应的属性。一方面是对数据成员的保护,而另一方面可以进行数据成员的取值与赋值进行限制。用一个小案列来说明一下,如下:
// 年龄一般来讲都是在0到一百之间
//防止出现小于0 或大于100 进行限制一下
private int age;
public int Age
{
get{return age;}
set{
//value 是set的隐式参数
//set值也就是对value值进行设置
if(value<0 || value>100)
{
//超出范围的值 进行归零
value = 0;
}
// 在范围内 进行值的设置
age = value;
}
}
}
以上的程序就对age数据成员进行保护的同时对age值的设置也进行了一个限定。
程序看起来都挺简单的,但是在实际的使用中,作用还是挺大的。