这是一种设计原则,称之为面向对象的封装性。从现在的开发角度说,是不建议直接将成员(指的是变量)直接用公开的方法供其它类访问的,因为这可能会导致有其它不可预见的时候意外修改了变量,或导致其它类似的问题。
当使用get、set将变量封装为属性以后,可以控制它们的可见性(能否被读取、能否被修改、能被谁操作等),修改的时候可以对将要修改的值进行验证是否合法,防止被其它类意外修改。这些都是面向对象设计的方法。
想知道详细的资料,可以搜索面向对象的相关特性:继承、封装和多态。
建议
关于C#中类的属性的一点理解
C#的class中大量使用属性,如
int speed;
int Speed
{
get{return speed;}
set{speed=value;}
}
本文将探讨以下几个问题
1 为什么要使用属性
2 使用属性带来的好处
关于为什么要使用属性:用于替代原C++或者其它编程语言中的存取器和变异器。
一直以来很多编程语言都是用存取器来实现对私有变量操控,比如SetSpeed()
及GetSpeed()这是两种方法,以前C++的写法是:
int speed;
int MaxSpeed=100;
bool SetSpeed(int s)
{
if(s<=MaxSpeed)
{
speed=s;
return ture;
}
else
return false;
}
int GetSpeed()
{
if(speed>MaxSpeed)
return MaxSpeed;
else
return speed;
}
其实存取器的一个主要目的就是封装好,并做数据效验,而在C#中则可以直接通过
属性来实现同样的功能
int speed;
int MaxSpeed=100;
int Speed
{
set
{
if(s<=MaxSpeed)
{
speed=s;
}
}
get
{
if(speed>MaxSpeed)
{ return MaxSpeed;
else
return speed;
}
}
}
可以看出其实C#中的属性也具备存取器的同样功能,而它编译成MSIL代码后也是一个方法;
使用属性带来的好处
1 为访问对象的内的实例变量及访问另一个对象中的实例变量提供了一致的语法
2 程序员可以节省检查一个实例变量是否为公有或私有,是否存在对此实例变量的存取器方法
3 每个需要被访问的实例变量通常会存在一个存取器,也就是要有Set及Get的方法,而实例的变量只需要一个属性。
另外当调用一个简单的get或set语句块时,编译器会执行特殊的优化,也就是内联(inline)
比如:
car.distance/Speed---->编译器会将此句转换成:car.distance/speed