您的位置: 网站首页 > 程序开发 > C#程序设计 > 第6章 C#面向对象 > 【6.3 字段和属性】

6.3 字段和属性

 

类中的静态特征可以使用字段和属性来表示。一般常见的方式是使用字段表示类的私有特征——即不允许被外部访问,而使用属性表示类的公开属性——即可以被外部访问。

6.3.1  字段

下面为之前介绍的公共汽车类添加一个字段,即座位数,表示公共汽车上拥有的座位数。添加后MyCarMyBus的代码如下:

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不仅列出了MyCarMyBus中的字段,而且还用箭头展现了MyBusMyCar之间的继承关系。

6.3.2  定义属性

属性提供灵活的机制来读取、编写或计算私有字段的值。通过属性可以方便地访问或修改字段的值,通常属性包括get代码块和set代码块。get代码块用来访问字段值,set代码块用于设置字段值。同时,属性也可以不对字段进行任何操作。

下面通过一个实例,充实MyCarMyBus类的代码,为其添加属性。

1.目的说明

创建一个Windows控制台应用程序,通过使用前面的MyCarMyBus类演示属性的使用方法。

2.实现步骤

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("公共汽车进站!");

        }

    }

}

3.运行结果

Ctrl+F5组合键运行程序,运行结果如图6-7所示。

6-7  运行结果

4.代码分析

代码中分别定义了Color属性,Weight属性和Seat属性。与其对应的字段分别为color字段、weight字段和seat字段。分别表示汽车的颜色,重量和座位。

这些属性中都包含一个get代码块和一个set代码块。其中get代码块用于访问,而set代码块用于赋值。当开始访问MyBus类型实例a时,返回的是color字段的初始值。随后对实例a的各个属性进行了赋值操作,再次访问时返回的是新值。

6.3.3  只读属性

定义属性时,如果只编写get代码块,则该属性是只读的。如果对其进行赋值操作,将引发异常。下面介绍一个实例,演示一个只有get代码块的属性。

1.目的说明

创建一个Windows控制台应用程序,创建一个只读属性。

2.实现步骤

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();

            }

        }

    }

}

3.运行结果

Ctrl+F5组合键运行程序,运行结果如图6-8所示。

6-8  运行结果

4.代码分析

代码中定义了一个只读属性,只能用于返回当前时间。如果在Main函数中插入如下的代码将会在编译时出现错误:

myClass.CurrentDate = “2006-1-1 12:00:00”

此时,Visual Studio 2005将会出现如图6-9所示的错误提示。

6-9  错误提示

6.3.4  只写属性

与只读方法相同,如果只定义set代码块而不定义get方法块,则可以定义一个只写属性。下面通过实例说明。

1.目的说明

创建一个Windows控制台应用程序,创建一个只写属性。

2.实现步骤

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";

    }

}

3.运行结果

Ctrl+F5组合键运行程序,运行结果如图6-10所示。

6-10  运行结果

4.代码分析

代码中定义了一个只写属性,只能用于设置Name属性的值。如果在Main函数中插入如下的代码将会在编译时出现错误,错误如图6-11所示。

Console.WriteLine(myClass.Name);

6-11  错误提示