字段(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);
}
}
}
代码执行结果如下图所示。
本例中,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();
}
}
}
代码执行结果如下图所示。
使用属性时,还要注意实例属性和静态属性的区别,实例属性使用对象调用,而静态属性应该由类调用。
CHY软件小屋原创作品!