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实现多线程同步的访问数据。
nameTextBox.DataBindings.Add("Text",person, "Name");
而有的初学者往往会犯这样的错误:将field直接绑定到GridView或者TreeView控件上;
3、property支持抽象,field不支持抽象;
4、接口支持property,而不支持field;
5、.Net支持基于property索引,而不支持field索引;
a、property实现安全检测
在对数据进行检测时,当数据不符合条件时,最好以抛异常的形式来处理,不要给数据设置默认值。如下例所示。
当给Name赋空值时,如果给_name数据设置默认值NoName,这是相当危险的。试想我们现在有两个实例分别为man1、man2,man1的Name为null,执行man2.Name = man1.Name,结果是man1.Name 为 "NoName",man1和man2的名字不相等;
b、property实现多线程同步的访问数据。
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的数据绑定。
其数据绑定机制事实上是使用反射来查找一个类型中对应的属性。例如下面的代码:
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 }
nameTextBox.DataBindings.Add("Text",person, "Name");
而有的初学者往往会犯这样的错误:将field直接绑定到GridView或者TreeView控件上;
3、property支持抽象,field不支持抽象;
4、接口支持property,而不支持field;
5、.Net支持基于property索引,而不支持field索引;
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,此外
我们应该尽量使用属性来实现对数据的公有、保护访问。
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 }