1、尽可能使用属性(Property),少使用字段(Field)实现对数据的访问

1、property本质上是两个函数set和get,在访问数据时可以对数据进行检查和操作,而field不支持;
      a、property实现安全检测
            在对数据进行检测时,当数据不符合条件时,最好以抛异常的形式来处理,不要给数据设置默认值。如下例所示。
      当给Name赋空值时,如果给_name数据设置默认值NoName,这是相当危险的。试想我们现在有两个实例分别为man1、man2,man1的Name为null,执行man2.Name = man1.Name,结果是man1.Name 为 "NoName",man1和man2的名字不相等;
      b、property实现多线程同步的访问数据。

ContractedBlock.gif ExpandedBlockStart.gif Code
 1         private string _name; // name field
 2         public string Name    // name property
 3         {
 4             set
 5             {
 6                 lock (this)
 7                 {
 8                     if (null == value)
 9                     {
10                         //_name = "NoName";
11                         throw new Exception("No name!");
12                     }
13                     else
14                     {
15                         _name = value;
16                     }
17                 }
18             }
19             get
20             {
21                 lock (this)
22                 {
23                     return _name;
24                 }
25             }
26         }
2、.Net的特性支持对property的数据绑定,而不支持对field的数据绑定。 其数据绑定机制事实上是使用反射来查找一个类型中对应的属性。例如下面的代码:
      nameTextBox.DataBindings.Add("Text",person, "Name");       
      而有的初学者往往会犯这样的错误:将field直接绑定到GridView或者TreeView控件上;

3、property支持抽象,field不支持抽象;

4、接口支持property,而不支持field;

5、.Net支持基于property索引,而不支持field索引;

ContractedBlock.gif ExpandedBlockStart.gif Code
 1     public class Man:IPerson
 2     {
 3         private IList<string> _books = new List<string>();
 4         public string this[int index]
 5         {
 6             set
 7             {
 8                 _books[index] = value;
 9             }
10             get
11             {
12                 return _books[index];
13             }
14         }
15 
16         private string _name; // name field
17         public string Name    // name property
18         {
19             set
20             {
21                 lock (this)
22                 {
23                     if (null == value)
24                     {
25                         //_name = "NoName";
26                         throw new Exception("No name!");
27                     }
28                     else
29                     {
30                         _name = value;
31                     }
32                 }
33             }
34             get
35             {
36                 lock (this)
37                 {
38                     return _name;
39                 }
40             }
41         }
42         private int _age;
43         public int Age
44         {
45             set
46             {
47                 _age = value;
48             }
49             get
50             {
51                 return _age;
52             }
53         }
54         private string _sex = "man";
55         public string Sex
56         {
57             get
58             {
59                 return _sex;
60             }
61         }
62 
63     }
6、综合以上几点,告诉我们不要直接把field改成property,此外 我们应该尽量使用属性来实现对数据的公有、保护访问。

转载于:https://www.cnblogs.com/JiangSoney/archive/2009/08/05/1539811.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值