字段(Field)与属性(Property)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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”,在弹出的菜单中选“转到定义”,可以看到它的定义。

相关文档
最新文档