• 【设计原则和建议】 属性



    基本

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

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

  • 相关阅读:
    CentOs7安装JDK/Tomcat/Git/Gradle
    eclipse更改web项目的WebContent目录
    (06)SpringCloud实战之Hystrix断路器
    (06)Eclipse中引入maven模块jar包显示成without test code解决方法
    (05)SpringCloud实战之Feign负载均衡
    (04)SpringCloud实战之Ribbon负载均衡
    (03)SpringCloud实战之Eureka服务注册与发现
    (02)SpringCloud实战之Rest微服务构建案例工程模块
    (01)框架整合之SpringMVC
    (02)Maven子工程继承父工程
  • 原文地址:https://www.cnblogs.com/PurpleTide/p/2212677.html
Copyright © 2020-2023  润新知