字段(field)和属性(property),在前面的课程中已经多次使用,本课,我们将继续讨论字段和属性应用上的一些细节。

字段主要用于保存类或对象的内部数据,大多数情况下,字段都应该定义为私有的(private),这样就可以有效的保护内部数据不会被直接或意外修改;属性则多用于类或对象的公共(public)成员,用于外部设置和读取数据,当然,也可以根据需要定义属性数据的设置和读取操作。

对于相对简单,比如可以直接设置和读取的数据项,可以使用简单的语法定义为属性,如下面的代码。

using System;

namespace ConsoleTest
{
    public class CAuto
    {
        //
        public string Model { get; set; }
        //
    }
}

代码中,我们在CAuto类中定义了一个名为Model的属性,其类型是string,可以存放文本类型的数据,其内容使用一对双引号包括,如“abc123”。下面的代码,我们在Program.cs文件中测试Model属性的使用。

using System;

namespace ConsoleTest
{
    class Program
    {
        static void Main(string[] args)
        {
            CAuto car1 = new CAuto();
            car1.Model = "X-18";
            Console.WriteLine("汽车型号:{0}", car1.Model);
        }
    }
}

代码执行结果如下图所示。

enter image description here

本例中,Model属性的数据可以设置和读取,这样的属性称为可读写属性,相应的,我们可以控制属性数据是否可以设置或读取数据,下面分别讨论。

只能读取数据的属性称为只读(readonly)属性,如下面的代码,我们将Model属性设置为只读属性。

public string Model { get; }

我们可以看到,定义属性时只包含get块,这个属性就是只读属性,可问题是,什么时候设置它的数据呢?一般来讲,只读属性的数据可以通过构造函数设置,构造函数是类中的一种特殊的方法,会在创建对象时调用,可以通过不同的参数带入需要的数据,在下一课会详细讨论方法和其参数的设置问题。

此时,还有两种处理方式,一是通过一个私有字段存放数据,这也是传统的属性处理方式,如下面的代码。

using System;

namespace ConsoleTest
{
    public class CAuto
    {
        private string myModel;
        // 构造函数
        public CAuto(string model)
        {
            myModel = model;
        }
        //
        public string Model
        {
            get { return myModel; }
        }
        //
    }
}

这种方式下,需要定义一个私有字段,如myModel;在构造函数中,会将带入的数据保存到myModel字段中;然后,在Model属性的get块中返回myModel字段的数据,也就是给出了Model属性的数据。

另一种处理只读属性的方式是使用自动属性,可以在定义属性时将set语句块设置为私有的,如下面的代码。

using System;

namespace ConsoleTest
{
    public class CAuto
    {
        // 构造函数
        public CAuto(string model)
        {
            Model = model;
        }
        //
        public string Model { get; private set; }
        //
    }
}

此方式处理只读属性需要注意,将set块设置为私有的,还可以在类的内部,如构造函数中设置属性值,但在类的外部则不能设置属性值的操作。我们可以看到,使用后者处理只读属性,语法更加简洁,含义也更加明确,这也是比较推荐的只读属性的实现方式。

虽然也可以使用只写属性,但实际应用情景并不多,但大家应该知道这种可行性,比如,下面的代码就是将LocalModel属性设置为只写。

using System;

namespace ConsoleTest
{
    public class CAuto
    {
        // 构造函数
        public CAuto() { }
        //
        public CAuto(string model)
        {
            Model = model;
        }
        //
        public string Model { get; private set; }
        //
        private string myLocalModel;
        public string LocalModel
        {
            private get
            {
                return myLocalModel;
            }
            set
            {
                myLocalModel = value;
            }
        }
        //
        public void ShowLocalModel()
        {
            Console.WriteLine("内部型号:{0}", myLocalModel);
        }
    //
    }
}

下面,我们在Program.cs文件中测试LocalModel属性的使用。

using System;

namespace ConsoleTest
{
    class Program
    {
        static void Main(string[] args)
        {
            CAuto car1 = new CAuto("X-18");
            car1.LocalModel = "x2018";
            car1.ShowLocalModel();
        }
    }
}

代码执行结果如下图所示。

enter image description here

使用属性时,还要注意实例属性和静态属性的区别,实例属性使用对象调用,而静态属性应该由类调用。

CHY软件小屋原创作品!