在面向对象编程(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;} }
当我们使用属性来访问私有成员变量时就会调用里面的get方法,当我们要修改该变量时就会调用set方法,当然在定义的时候可以只定义一个get方法或只定义一个set方法。如果只定义get方法,那么这个相应变量就是“只读”的;如果只定义set方法,那么相应变量就是“只写”的。
看到这时,我有个问题,既然外界可以通过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就像一位门卫大叔一样,只有好人才能进来。可以通过属性来控制对员变量的读写,防止对成员变量的非法赋值等。
前几天学术交流会上刚说到了客户变更的问题,它们在这方面就有非同小可的作用,还是举个小例子:
有一个温度计的类:
class Thermometer { private double temperature; public Thermometer(double temperature) //构造函数 { this.temperature = temperature; } public double Temperature { get { return temperature; } set { temperature = value; } } }
假设这里的温度单位表示的是摄氏度(℃),如果在需求分析阶段误解了客户的原始意愿或者客户在日后变更了需求,需要把系统中所有表示温度的变量temperature都用来表示开尔文温度(K)。那么不必动系统中成百上千个Temperature属性,只需在get和set函数中稍微修改一下代码即可:
class Thermometer { private double temperature; public Thermometer(double temperature) //构造函数 { this.temperature = temperature; } public double Temperature { //****修改后****↓↓↓↓↓↓↓↓ get { return temperature-273.15; } set { temperature = value+273.15; } //****修改后****↑↑↑↑↑↑↑↑ } }
下面简单建一个控制台应用程序来测试一下,主函数为:
class Test { static void Main(string[] args) { Thermometer a = new Thermometer(40); Console.WriteLine(a.Temperature); } }
用构造函数给温度设的初值为40度,因此代码修改前运行结果为:
代码修改后运行结果为:
如有不足与纰漏,恳请您留下宝贵意见与建议,感激不尽!