第11讲属性1
现在来讲一下C#中的属性。属性是类,结构和接口的命名成员。它们提供了通过访问器(accessor)读,写或计算私有字段值的灵活机制。
属性是这样的成员:它们提供灵活的机制来读取,编写或计算私有字段的值。可以像使用公共数据成员一样使用属性,但实际上它们是称为“访问器”的特殊方法。这使得数据在可被轻松访问的同时,仍能提供方法的安全性和灵活性。
下面我们用代码一步一步来说明为什么要使用属性。
- using System;
- //打个比方我们有个网站,每当有新用户注册的时候,我们需要记录这些用户的信息
- //声明一个User类来记录这些用户的信息
- class User
- {
- //姓名,性别
- public string name;
- public string sex;
- }
- //声明一个类去使用User类
- class Property
- {
- static void Main()
- {
- //实例化一个张三User对象
- User zs = new User();
- //对其赋值
- zs.name = "张三";
- zs.sex = "男";
- Console.WriteLine("姓名:" + zs.name + " 性别:" + zs.sex);
- }
- }
- using System;
- class User
- {
- public string name;
- public string sex;
- //SetSex方法
- public void SetSex(string values)
- {
- if (values == "男" || values == "女")
- {
- sex = values;
- }
- else
- {
- Console.WriteLine("性别只能为“男”或“女”");
- }
- }
- }
- class Property
- {
- static void Main()
- {
- User zs = new User();
- zs.name = "张三";
- //直接调用SetSex赋值
- zs.SetSex("牛");
- Console.WriteLine("姓名:" + zs.name + " 性别:" + zs.sex);
- }
- }
- using System;
- class User
- {
- //设为私有的
- private string name;
- private string sex;
- //设置
- public void SetName(string values)
- {
- name = values;
- }
- //读取
- public string GetName()
- {
- return name;
- }
- public void SetSex(string values)
- {
- if (values == "男" || values == "女")
- {
- sex = values;
- }
- else
- {
- Console.WriteLine("性别只能为“男”或“女”");
- }
- }
- public string GetSex()
- {
- return sex;
- }
- }
- class Property
- {
- static void Main()
- {
- User zs = new User();
- zs.SetName("张三");
- zs.SetSex("牛");
- Console.WriteLine("姓名:" + zs.GetName() + " 性别:" + zs.GetSex());
- }
- }
这是大家可能会问了,讲了这么久为什么没有提到属性半个字呢?好,现在属性可以粉墨登场了~由于属性的存在,简化了SetSex跟Getsex,也就是读取和设置私有字段值的这么一个方法。好,我们再次修改代码,使用属性:
- using System;
- class User
- {
- //设为私有的
- private string name;
- private string sex;
- public void SetName(string values)
- {
- name = values;
- }
- public string GetName()
- {
- return name;
- }
- public void SetSex(string values)
- {
- if (values == "男" || values == "女")
- {
- sex = values;
- }
- else
- {
- Console.WriteLine("性别只能为“男”或“女”");
- }
- }
- public string GetSex()
- {
- return sex;
- }
- //设置属性Name
- public string Name
- {
- //在属性Name里面声明了2个方法一个是get一个是set
- //这2个方法没有任何的修饰符,而这2个方法实现的功能跟SetName和GetName完全一样
- get
- {
- return name;
- }
- set
- {
- //大家注意这个value,它是一个隐含的参数
- //也就是说IL代码会自动帮你生成一个value这么一个参数,我们可以直接调用它
- //value就先当于SetName里面的values参数
- //value的类型是跟私有字段name的类型是一致的
- name = value;
- }
- }
- //设置一个属性Sex
- public string Sex
- {
- get
- {
- return sex;
- }
- set
- {
- if (value == "男" || value == "女")
- {
- sex = value;
- }
- else
- {
- Console.WriteLine("性别只能为“男”或“女”");
- }
- }
- }
- }
- class Property
- {
- static void Main()
- {
- User zs = new User();
- zs.SetName("张三");
- zs.SetSex("男");
- Console.WriteLine("姓名:" + zs.GetName() + " 性别:" + zs.GetSex());
- //调用属性
- zs.Name = "李四";
- zs.Sex = "牛";
- Console.WriteLine("姓名:" + zs.Name + " 性别:" + zs.Sex);
- }
- }

屏幕上正常输出了结果。李四使用的是属性,并且对性别同样能进行判断。也就是说属性实现了同方法一样的功能,它简化了SetSex和GetSex的调用,我们看下属性的调用是和字段的调用一样的,直接用=进行赋值。
我们再仔细看下私有字段的命名和属性的命名只是大写小不同而已,这样的命名在C#中没有什么问题。但是如果你的工程中含有VB.NET代码,而那些代码要访问这个类,这样呢就会出现一些问题,因为VB.NET代码是大小写不敏感的,所以最好给私有字段改下名字,比如m_name,这样就更合乎规范了~