字段(field)通常定义为private,表示类的状态信息。
CLR支持只读和读写字段。值得注意的是,大部分情况下字段都是可读可写的,只读字段只能在构造函数中被赋值,其他方法不能改变只读字段。常见的字段定义为:
public class Client
{
private string name; //用户姓名
private int age; //用户年龄
private string password; //用户密码
}
如果以public表示类的状态信息,则我们就可以以类实例访问和改变这些字段内容,例如:
public static void Main()
{
Client xiaoWang = new Client();
xiaoWang.name = "Xiao Wang";
xiaoWang.age = 27;
xiaoWang.password = "123456"
}
这样看起来并没有带来什么问题,Client实例通过操作公有字段很容易达到存取状态信息的目的,然而封装原则告诉我们:类的字段信息最好以私有方式提供给类的外部,而不是以公有方式来实现,否则不适当的操作将造成不必要的错误方式,破坏对象的状态信息,数据安全性和可靠性无法保证。
例如: xiaoWang.age = 1000; xiaoWang.password = "5&@@Ld;afk99";
显然,小王的年龄不可能是1000岁,他是人不是怪物;小王的密码也不可能是“@&;”这些特殊符号,因为ATM机上根本没有这样的按键,而且密码必须是6位。所以对字段公有化的操作,会引起对数据安全性与可靠性的破坏,封装的第一个原则就是:将字段定义为private。 那么,如上文所言,将字段设置为private后,对对象状态信息的控制又该如何实现呢?小王的状态信息必须以另外的方式提供给类外部访问或者改变。同时我们也期望除了实现对数据的访问,最好能加入一定的操作,达到数据控制的目的。因此,面向对象引入了另一个重量级的概念:属性。 2.属性 属性(property)通常定义为public,表示类的对外成员。属性具有可读、可写属性,通过get和set访问器来实现其读写控制。例如上文中Client类的字段,我们可以相应地封装其为属性:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public class Client
{
private string name; //用户姓名
public string Name
{
get { return name; }
set { name = value == null ? String.Empty : value; }
}
private int age; //用户年龄
public int Age
{
get { return age; }
set {
if ( ( value > 0 ) && ( value < 150 ) )
{age = value; }
else
{
throw new ArgumentOutOfRangeException ( "年龄信息不正确。" );
}
}
}
}
当我们再次以 xiaoWang.Age = 1000; 这样的方式来实现对小王的年龄进行写控制时,自然会弹出异常提示,从而达到了保护数据完整性的目的。