类中的静态特征可以使用字段和属性来表示。一般常见的方式是使用字段表示类的私有特征——即不允许被外部访问,而使用属性表示类的公开属性——即可以被外部访问。
下面为之前介绍的公共汽车类添加一个字段,即座位数,表示公共汽车上拥有的座位数。添加后MyCar和MyBus的代码如下:
class MyCar
{
string Color = "Red";
int Weight = 1000;
public void Run()
{
Console.WriteLine("汽车启动!");
}
}
class MyBus : MyCar
{
int seat = 30;
public void Start()
{
Console.WriteLine("公共汽车出站!");
}
public void Stop()
{
Console.WriteLine("公共汽车进站!");
}
}
C#中提供了一个查看类关系图的工具,鼠标右键单击解决方案管理器中的Program.cs文件,选择“查看类关系图”命令,如图6-5所示。Visual Studio 2005将转到如图6-6所示的界面。
图6-5 “查看类关系图”命令 图6-6 类关系图
可以看到,Visual Studio 2005不仅列出了MyCar和MyBus中的字段,而且还用箭头展现了MyBus和MyCar之间的继承关系。
属性提供灵活的机制来读取、编写或计算私有字段的值。通过属性可以方便地访问或修改字段的值,通常属性包括get代码块和set代码块。get代码块用来访问字段值,set代码块用于设置字段值。同时,属性也可以不对字段进行任何操作。
下面通过一个实例,充实MyCar和MyBus类的代码,为其添加属性。
创建一个Windows控制台应用程序,通过使用前面的MyCar和MyBus类演示属性的使用方法。
(1)创建一个名为ClassProp的控制台应用程序项目。
(2)修改Program.cs文件的内容如下:
namespace ClassProp
{
class Program
{
static void Main(string[] args)
{
MyBus a = new MyBus();
Console.WriteLine("颜色:");
Console.WriteLine(a.Color);
Console.WriteLine("重量:");
Console.WriteLine(a.Weight);
Console.WriteLine("座位:");
Console.WriteLine(a.Seat);
a.Color = "Blue";
a.Weight = 2000;
a.Seat = 25;
Console.WriteLine("颜色:");
Console.WriteLine(a.Color);
Console.WriteLine("重量:");
Console.WriteLine(a.Weight);
Console.WriteLine("座位:");
Console.WriteLine(a.Seat);
}
}
class MyCar
{
//颜色字段
string color = "Red";
//重量字段
int weight = 1000;
//颜色属性
public string Color
{
get
{
return color;
}
set
{
color = value;
}
}
//重量属性
public int Weight
{
get
{
return weight;
}
set
{
weight = value;
}
}
public void Run()
{
Console.WriteLine("汽车启动!");
}
}
class MyBus : MyCar
{
//座位字段
int seat = 30;
//座位属性
public int Seat
{
get
{
return seat;
}
set
{
seat = value;
}
}
public void Start()
{
Console.WriteLine("公共汽车出站!");
}
public void Stop()
{
Console.WriteLine("公共汽车进站!");
}
}
}
按Ctrl+F5组合键运行程序,运行结果如图6-7所示。
图6-7 运行结果
代码中分别定义了Color属性,Weight属性和Seat属性。与其对应的字段分别为color字段、weight字段和seat字段。分别表示汽车的颜色,重量和座位。
这些属性中都包含一个get代码块和一个set代码块。其中get代码块用于访问,而set代码块用于赋值。当开始访问MyBus类型实例a时,返回的是color字段的初始值。随后对实例a的各个属性进行了赋值操作,再次访问时返回的是新值。
定义属性时,如果只编写get代码块,则该属性是只读的。如果对其进行赋值操作,将引发异常。下面介绍一个实例,演示一个只有get代码块的属性。
创建一个Windows控制台应用程序,创建一个只读属性。
(1)创建一个名为ReadOnlyProp的控制台应用程序项目。
(2)修改Program.cs文件的内容如下:
namespace ReadOnlyProp
{
class Program
{
static void Main(string[] args)
{
MyClass myClass = new MyClass();
Console.WriteLine(myClass.CurrentDate);
}
}
class MyClass
{
// 返回字符串形式的当前系统时间
public string CurrentDate
{
get
{
return DateTime.Now.ToString();
}
}
}
}
按Ctrl+F5组合键运行程序,运行结果如图6-8所示。
图6-8 运行结果
代码中定义了一个只读属性,只能用于返回当前时间。如果在Main函数中插入如下的代码将会在编译时出现错误:
myClass.CurrentDate = “2006-1-1 12:00:00”
此时,Visual Studio 2005将会出现如图6-9所示的错误提示。
图6-9 错误提示
与只读方法相同,如果只定义set代码块而不定义get方法块,则可以定义一个只写属性。下面通过实例说明。
创建一个Windows控制台应用程序,创建一个只写属性。
(1)创建一个名为WriteOnlyProp的控制台应用程序项目。
(2)修改Program.cs文件的内容如下:
namespace WriteOnlyProp
{
class Program
{
static void Main(string[] args)
{
MyClass myClass = new MyClass();
myClass.Name = "zhang";
}
}
class MyClass
{
// 返回字符串形式的当前系统时间
public string Name
{
set
{
name = value ;
Console.WriteLine("Name属性的值被修改为:{0}", name);
}
}
string name = "wang";
}
}
按Ctrl+F5组合键运行程序,运行结果如图6-10所示。
图6-10 运行结果
代码中定义了一个只写属性,只能用于设置Name属性的值。如果在Main函数中插入如下的代码将会在编译时出现错误,错误如图6-11所示。
Console.WriteLine(myClass.Name);
图6-11 错误提示