Effective C# 原则1:尽可能的使用属性(property),而不是数据成员(field)。
把所有的字段都设为私有字段,如果要暴露它们,则把它们封装成属性。这也是微软推荐的方式。具体的好处此处不赘述。
属性的实质是方法(get和set方法),IL中没有属性的概念。因此,使用属性必然会带来性能的降低。到底使用属性和使用字段的性能差多少。我自己写了一个小程序进行测试。主要代码如下:

















































测试方式为对字段和属性循环赋值和读取(以上代码只有赋值部分)。
测试结果如下表
表1 | 循环赋值 | |
一千万次 | 一亿次 | |
字段 | 0.03125秒 |
0.3125秒 |
属性 | 1.702315秒 | 17.140625秒 |
表2 | 循环读取 | |
一千万次 | 一亿次 | |
字段 | 0.03125秒 |
0.2825秒 |
属性 | 0.09375秒 | 0.984375秒 |
结论:使用属性和字段之间的性能差距大概是:赋值,50-60倍左右,读取,3倍左右。
补充:这个测试结果只是针对int型的,也许对字符串或者其他类型的会有不同结果。
但是可以看出来,对属性赋值一次的时间是一千万分之一秒,所以即使它比字段赋值慢50倍,它不可能成为影响性能的主要瓶颈。应该可以放心使用。