在面向对象编程(OOP)中,是不允许外界直接对类的成员变量直接访问的,既然不能访问,那定义这些成员变量还有什么意义呢?所以C#中就要用set和get方法来访问私有成员变量,它们相当于外界访问对象的一个通道,一个“接口”。先来看一段代码:
class Employee
{
private string name;
private byte age;
public string Name
{
get { return name; }
set { name = value; }
}
public byte Age
{
get { return age; }
set { age = value; }
}
}
代码中定义了两个私有变量name和age,当我们不想让外界随意访问该私有变量时,可以使用属性来访问,语法为:
public <返回类型(要与被访问变量的类型相同)> <属性名(不能与被访问变量同名)>
{
get{ return <被访问变量>;}
set{ <被访问变量> = value;}
}
C# get set释一:属性的访问器包含与获取(读取或计算)或设置(写)属性有关的可执行语句。
当我们使用属性来访问私有成员变量时就会调用里面的get方法,当我们要修改该变量时就会调用set方法,当然在定义的时候可以只定义一个get方法或只定义一个set方法。如果只定义get方法,那么这个相应变量就是“只读”的;如果只定义set方法,那么相应变量就是“只写”的。
属性”是.net的特色之一。其实这这个属相访问器就相当于java为私有变量暴露了一个外部可以修改私有变量的方法,其作用有两点是:
1.既然外界可以通过set和get访问类内私有成员,那为什么不直接把它定义成共有,直接供外界访问呢?拿上面的Employee类来说明:
class Employee
{
private string name;
private byte age;
public string Name
{
get { return name; }
set { name = value; }
}
//****修改后****↓↓↓↓↓↓↓↓
public byte Age
{
get { return age; }
set
{
if (value > 10 && value<=100) //一般在公司雇员的年龄都在10到100岁之间
age = value;
}
}
//****修改后****↑↑↑↑↑↑↑↑
}
上例中,set就像一位门卫大叔一样,只有好人才能进来。可以通过属性来控制对员变量的读写,防止对成员变量的非法赋值等。
2.便于维护.因为:如果一个类的一个变量int a ,在其它包或命名空间类中使用了1000次,但是过了许久,你想把a改为b,如果直接对变量a操作的话,就得需求修改整个程序的1000处. 如果用属性了,就不会了,只需改这个方法即可public int A{ set { a = value; } get { return a; }}放为:public int B{ set { b = value; } get { return b; }}除去这个属性之外的地方根本不需要改变。
public class Car
{
private string color;
public string Color
{
get {return color; }
set {color=value; }
}
}
通过GET和SET对公有变量Color进行读写操作,实际就是间接更改color私有变量的值,那既然如此。为何不设color为public,让实例直接对color进行读写操作呢? 如果有一天,老板让你把这个类改成当汽车的颜色改变时,同时计算一下汽车的《价格》属性那么如果直接对Color操作,你不是死定了?