c#中的property,在我语境中,我把它翻译成性质,它的英语本意也是性质。一个类的对象的性质,完全可以用类的成员变量(member variable)来体现,为什么还要引入property呢?
这首先要从c#语言的设计思想来说。C#的一大特性就是封装。你看,它的namespace,它的类,都是要用大括号括起来的。函数必须是在类里括起来,即使它是程序入口的static void main()。强封装带来的就是强隐私性。
如果明了了c#的封装和隐私性的主要特性。那就很好理解property的引入了。在成员变量是隐私的情形下,又需要对外,那就用property好了。
假设有一种秘密型号的导弹,它的射程和弹头当量是保密的,相当于隐私的成员变量;但是它能否摧毁既定目标是需要让外界知道的,以发挥其威慑作用,这就是它的性质(property)。我们在建立导弹类的时候,设置两个私有变量:射程和弹头当量;再设置一个公有性质,为布尔变量。如果能摧毁目标,则该变量为真。这个公有的能否摧毁性质可以被外界所知,它是由上述两个私有变量计算来的。但是这两个私有变量是外界不可见的。
下面是完整的c#代码
using System;
namespace MissileQuality
{
class Missile {
private String type;//型号.
private int range;//射程,单位:公里.
private int equiv;//当量,单位:万吨TNT.
public Missile(string typestr)//在导弹初始化的时候,输入导弹的型号
{
type = typestr;
if(type=="DF21D")
{
range = 3200;
equiv = 30;
}
}
public bool IsDestroy{ //以下,根据射程和当量,计算出能否摧毁的性质.注意public声明符,这个性质是公开的!!!
get{
if (range>=1759 && equiv >= 5 )
return true;
else
return false;
}
}
public void Launch()
{
Console.WriteLine("fired and throwed to the objective");
}
}
class Program {
public static void Main(string[] args)
{
Missile m = new Missile("DF21D");//新建一枚导弹,型号是“DF21D”
if(m.IsDestroy == true) //在本类(Program 类 ),用到了这枚导弹的性质————能否摧毁.导弹的射程和当量是保密的,
//但是能否摧毁是要让外界知道的,可以在声明类以外的类使用
Console.WriteLine("this missile insure destroying the objective");
Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);
}
}
}
上面这个例子,很好地说明了C#的封装特性,和property引入的意义。
如果是细心的朋友,会发现range>=1759,这个1759是怎么来的呢?
它是从海南岛中心到九段线最远处的距离。少年当自强。