基本
1.在.NET中属性的本质实现是方法
- 虽然本质是方法,不过当作互斥变量来使用还是挺方便的,(如Hashtable.SyncRoot)
2.属性应该表现出相对静态的特征
- 在没有其他代码干扰的时候,访问一个属性无论多少次 应该返回同样的结果 (DateTime.Now就是一个错误的设计)
3.属性get方法一般不抛出异常
- 现在很多地方使用到了延迟加载的设计,所以某些时候还是会抛出异常的
4.谨慎使用集合类型的属性
- 如直接返回List<T> 此类的元素可能,可能导致内部成员在外部被修改
- 尽量把集合类型的属性设计为只读的(没有set)
- 遍历集合类型的属性可能导致性能问题
public static List<string> Users
{
get
{
Console.WriteLine("Call");
return new List<string>() { "1", "2", "3" };
}
}
public static void Main()
{
for (int i = 0; i < Users.Count; i++)
{
Console.WriteLine(Users[i]);//属性本质上还是方法 这里又去调用Users的get方法了
}
}
5.如果某个属性是必须赋值的,把它放到构造函数里面去
//看到这种代码真的想杀人啊
UserService service = new UserService();
service.UserId = 123435; //不赋值居然按照UserId=0来处理
service.Method1(parameter1);
service.Method2(parameter2);
6.属性设计的初始目的是为了封装对私有字段的访问
7.推荐Pascal命名规则
8.一般情况下,字段名不需要包括类名
public class Company
{
public Guid Id { get; set; }
public string Name { get; set; }
public Guid CompanyId { get; set; }//Company的意思重复了
public string CompanyName { get; set; }//需要多打字
//代码智能提示的时候不够快速定位
}
对比
1.和字段对比
- 属性提供了更为强大的,灵活的功能来操作字段
- 出于面向对象的封装性,字段一般不设计为Public
- 属性允许在set和get中编写代码
- 属性允许控制set和get的可访问性,从而提供只读或者可读写的功能 (逻辑上只写是没有意义的)
- 属性可以使用override 和 new
- 同样的,可以在接口中声明属性
- 由于内联的存在,简单的属性和字符的性能差不多
2.和方法对比
- 属性使用方便
- 设计方向的不一样,属性偏向静态,方法偏向动态
- 适当的时候,使用属性 如 (Class.User 和 Class.GetUser())
部分内容引用自MSDN,FxCop 和其他第三方文章..
因为本人水平有限,如有遗漏或谬误,还请各位高手指正