同事问到C#中的属性(Property)怎么理解?

 同事问到C#中的属性(Property)怎么理解?我说“属性就是对私有字段进行读取。”事后分析,其实属性还是值得研究的,首先属性是类、结构、接口的命名成员,它提供了通过访问器读、写或者计算私有字段值的灵活机制。举个例子:通过User类来记录用户注册信息。
 1using System; 
 2class User 
 3
 4public string name; 
 5public string sex; 
 6}
 
 7class Property 
 8
 9static void Main() 
10
11User zm=new User(); 
12zm.name="无为"
13zm.sex=""; 
14Console.WriteLine("姓名:"+zm.name+"性别:"+zm.sex); 
15}
 
16}
 
17
此时如果用户输入的性别为其他的,比如“猪”,哈哈,是不是一样可以通过编译器了?解决方法是:
 1using System; 
 2class User 
 3
 4public string name; 
 5public string sex; 
 6public void SetSex(string values) 
 7
 8if (values==""||values==""
 9
10sex=values; 
11}
 
12else 
13
14Console.WriteLine("性别只能是男或者女"); 
15}
 
16}
 
17}
 
18class Property 
19
20static void Main() 
21
22User zm=new User(); 
23zm.name="无为"
24zm.SetSex(""); 
25Console.WriteLine("姓名:"+zm.name+"性别:"+zm.sex); 
26}
 
27}
 
28
问题解决:但是值得注意的是name、sex还是public属性,依然可以修改,给name、sex设置为public,破坏了类的封装,存在潜在的危险。应该设置为private.这样就需要用到属性的知识去声明,读取这两个字段。代码如下:
 1using System; 
 2class User 
 3
 4private string name; 
 5private string sex; 
 6public void SetName(string values) 
 7
 8name=values; 
 9}
 
10public string GetName() 
11
12return name; 
13}
 
14public void SetSex(string values) 
15
16if (values==""||values==""
17
18sex=values; 
19}
 
20else 
21
22Console.WriteLine("性别只能为“男”或者“女”"); 
23}
 
24}
 
25public string GetSex() 
26
27return sex; 
28}
 
29public string Name 
30
31get 
32
33return name; 
34}
 
35set 
36
37name=value;//隐含参数 
38}
 
39}
 
40public string Sex 
41
42get 
43
44return sex; 
45}
 
46set 
47
48if (value==""||value==""
49
50sex=value; 
51}
 
52else 
53
54Console.WriteLine("性别只能为“男”或者“女”"); 
55}
 
56}
 
57}
 
58}
 
59class Property 
60
61static void Main() 
62
63User zm=new User(); 
64zm.SetName("无为"); 
65zm.SetSex(""); 
66Console.WriteLine("姓名:"+zm.GetName()+" 性别:"+zm.GetSex()); //方法调用 
67zm.Name="WuWei"//属性调用 
68zm.Sex=""
69Console.WriteLine("姓名:"+zm.Name+" 性别:"+zm.Sex); 
70}
 
71}
 
72
从运行结果上看,把“无为”改成了“WuWei”,并且zm.Sex="天"没有对性别做修改。
注意:属性(Property)的调用跟类的字段的调用方法一样,赋值用等号。读取跟类的字段的读取方法一样。值得注意的是:private string name; public string Name;这样在C#中没有问题,但是如果在一个工程文件中存在多种语言,比如VB.NET.那么就会出现问题,个人建议把字段名称前面加一个标志符,比如:u_name、U_sex.这样就方便很多。

posted on 2008-03-24 12:00  CodeShark  阅读(370)  评论(0编辑  收藏  举报

导航