C#:
字段(Field)与属性(Property)
基本概念
字段与属性的关系
属性访问器的使用
附:实例
(本文中的代码均在VS2005中运行过。启动VS2005,新建一个C#语言的控制台应用程序项目,将本文中代码复盖原自动生成的代码,启动调试,就可以看到运行结果)
一)基本概念
看下面一段代码:
……
User zs =new
User();
zs.Name = "张三";
Console.WriteLine("姓名: " +
zs.Name);
……
可能有人推断,Name一定是User类的一个成员变量。----对于C#而言,这个推断十有八九是错的。
C#的类成员在C++基础上有了扩展,“字段”与“属性”就是扩展后的两种类成员。
C#类中的“字段”,与C++类中的“变量”及JAVA中的“域”是同一概念。
对私有字段的读写,只能通过类内的方法。C#专门提供了一个对私有字段进行读写的特殊“方法”。这种"方法"不需要参数,但有含get{}或set{}的代码块。这种特殊的“方法”,在C#中称为“属性”。例如:
public class User
{
private
string m_name; //m_name为字段
public string Name
//Name为属性,它含有代码块
{
get
{
return m_name; //读取(返回m_name值)
}
set
{
m_name = value; //为m_name赋值
}
}
User类中的m_name为“字段”,而Name则为“属性”,属性代码块中get与set,称为属性访问器。
私有的字段m_name可以通过公开的属性Name对它进行读写操作。 通过“属性”读取“字段”值时,将触发get访问器;通过“属性”为“字段”赋值,将触发set访问器。
如:
User zs =new User();
zs.Name = "张三"; //此句将自动触发set访问器,将"张三"赋予m_name
Console.WriteLine("zs的姓名是: " + zs.Name);
//此句将自动触发get访问器,显示m_name的值。
注意这里的zs.Name,
会使有些人误以为zs有一个存储着zs姓名的成员变量Name,但实际上存放zs的姓名的成员变量是m_name(在C#称之为“字段”),只是它已被彻底隐藏起来了。
二)字段与属性的关系
一个“属性”总是与某个“字段”相关联,两者有扯不断的关系。这种关系可分2种:
1)通过属性访问器读(或写)的值就是字段的值
如上例,属性Name的访问器读写的值就是字段m_name的值。
2)通过属性访问器读(或写)的值是对字段进行某种运算后得出的值。两者可能是同一类型,也可能不是。如下例int类型的Age属性的值,就是对DateTime类型的字段m_birthday进行计算后得出的:
……
private DateTime m_birthday;
public int
Age
{
get
{
return
DateTime.Now.Year -
m_birthday.Year;
}
}
……
三)访问器
在属性中的只实现get访问器的,称只读属性;只实现set访问器的,称只写属性;两者都实现的,称读写属性。(参见后面的示例)。
通过访问器,我们可以根据访问者的身份对其操作权限进行限定,并对数据的合法性进行检查。
四)附例
using System;
namespace Field_Property
{
class
User
{
private
string m_name;
private
DateTime
m_birthday;
public
User(string
name)
{
this.m_name =
name;
}
public
string
Name
//读写属性
{
get {
return m_name;
}
set {m_name =
value ; }
}
public
DateTime Birthday //只写属性
{
set
{
if (value < Convert.ToDateTime("1900-1-1") || value.Year > DateTime.Now.Year - 3)
Console.WriteLine("年龄有误!");
else
m_birthday = value;
}
}
public
int
Age
//只读属性
{
get
{
return
DateTime.Now.Year -
m_birthday.Year;
}
}
}
class
Program
{
static
void Main()
{
User zs =
new User("张三");
zs.Birthday = Convert.ToDateTime("1980-1-1");
Console.WriteLine("姓名: "
+ zs.Name);
Console.WriteLine("年龄: "
+ zs.Age);
Console.ReadKey();
}
}
}
注:DateTime是结构。在VS2005代码编辑界面右击“DateTime”,在弹出的菜单中选“转到定义”,可以看到它的定义。