加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

(C#)字段(Field)与属性(Property)

(2011-11-17 16:03:31)
标签:

字段

field

属性

property)

csharp

分类: C#笔记

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则为“属性”,属性代码块中getset,称为属性访问器。

私有的字段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”,在弹出的菜单中选“转到定义”,可以看到它的定义。

 

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有