在属性与字段中,为什么要给字段设private

Posted on 2010-03-22 10:46  pumeifen  阅读(1266)  评论(0编辑  收藏  举报

 

字段(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类的字段,我们可以相应地封装其为属性:

 

代码
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; 这样的方式来实现对小王的年龄进行写控制时,自然会弹出异常提示,从而达到了保护数据完整性的目的。