【设计原则和建议】 属性


基本

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方法了
    }
    }
    输出结果如下,Users的get方法被调用了6次   (注意 这个例子中如果使用foreach而不是for 就没有重复调用的问题)

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 和其他第三方文章..

因为本人水平有限,如有遗漏或谬误,还请各位高手指正

原文地址:https://www.cnblogs.com/PurpleTide/p/2212677.html