为了更好的隐藏数据成员,将对数据成员的存储与访问分离开,避免直接访问可能造成的错误,同时又具备使用数据成员的灵活性,我们用到了属性。对于属性的读写我们用到set和get。通过set方法来设置属性,get方法来获取属性。
对于属性的读写主要有两种方式:
1、使用纯方法来访问属性。具体代码如下
class Student
{
private string name;
private uint number;
public void SetName(string name)
{
this.name = name;
}
public void SetNumber(uint number) {
this.number = number;
}
public string GetName() {
return name;
}
public uint GetNumber() {
return number;
}
}
- 使用:
class C
{
public static void Main(string[] args)
{
Student s = new Student();
s.SetName("Mike");
s.SetNumber(23);
Console.WriteLine("student name:{0},number:{1}",s.GetName(),s.GetNumber());
}
}
2、使用属性方式访问属性。
使用这种方式需要注意,同一属性的get和set方法不能够分开定义。及name属性的set和get方法都要放在public string Name的属性定义中,若有两个public string Name编译会报错。编译器会认为Student类定义了两个同名的属性,一个只读一个只写。
class Student
{
private string name;
private uint number;
public string Name
{
set
{
name = value;
}
get
{
return name;
}
}
public uint Number
{
set
{
number = value;
}
get
{
return number;
}
}
}
- 使用:
class C
{
public static void Main(string[] args)
{
Student s = new Student();
s.Name = "Mike";
s.Number = 23;
Console.WriteLine("student name:{0},number:{1}",s.Name,s.Number);
}
}
既然外界可以通过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度,代码修改前运行结果为“40”,代码修改后运行结果为“-233.15”。