字段(Field)与属性(Property)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C#: 字段(Field)与属性(Property)
基本概念
字段与属性的关系
属性访问器的使用
附:实例
(本文中的代码均在VS2005中运行过。启动VS2005,新建一个C#语言的控制台应用
程序项目,将本文中代码复盖原自动生成的代码,启动调试,就可以看到运行结果)一)基本概念
看下面一段代码:
……
User zs =new User();
= "张三";
Console.WriteLine("姓名: " + );
……
可能有人推断,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();
= "张三";//此句将自动触发set访问器,将"张三"赋予m_name
Console.WriteLine("zs的姓名是: " + );//此句将自动触发get 访问器,显示m_name的值。
注意这里的, 会使有些人误以为zs有一个存储着zs姓名的成员变量Name,但实际上存放zs的姓名的成员变量是m_name(在C#称之为“字段”),只是它已被彻底隐藏起来了。
二)字段与属性的关系
一个“属性”总是与某个“字段”相关联,两者有扯不断的关系。这种关系可分2种:
1)通过属性访问器读(或写)的值就是字段的值
如上例,属性Name的访问器读写的值就是字段m_name的值。
2)通过属性访问器读(或写)的值是对字段进行某种运算后得出的值。两者可能是同一类型,也可能不是。如下例int类型的Age属性的值,就是对D ateTime 类型的字段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("姓名: "+ );
Console.WriteLine("年龄: "+ zs.Age);
Console.ReadKey();
}
}
}
注:DateTime是结构。在VS2005代码编辑界面右击“DateTime”,在弹出的菜单中选“转到定义”,可以看到它的定义。