• 漫话CLR ---- 属性


      又是一个语法糖,属性 = GetXXX() Set XXX() 的语法糖.

      属性就是封装的方法.看CLR,看的就是去伪存真,剥离语法糖之后的C#,其实也就是那么回事.

      属性分为无参属性和有参属性.性能上由于在编译的时候使用了内联技术,完全可以忽略性能损失不计.

      无参属性

      这种属性就是在Java或者其他语言中的Get Set方法,比如我有这么个类:

    class Person
    {
        public int Age;
        public string Name;
    }

      其中有年龄和姓名两个字段,我们提供get和set方法进行封装访问他们的过程,以达到保护字段安全性的作用.

    class Person
    {
        int m_age;
        string m_name;
        
        public Person()
        {
        
        }
        
        public string getName()
        {
            return m_name;
        }
        
        public void setName(string name)
        {
            m_name = name;
        }
        
        public int getAge()
        {
            return m_age;
        }
        
        public void setAge(int age)
        {
            m_age = age;
        }
    }

      为什么这么做呢?如果不使用get和set方法不也是可以访问字段的么?是的,但是我们也可以轻易的就破坏字段的安全性,比如:

    Person p = new Person();
    p.Age = -5; //没有人的年龄是-5,这显然是不正确的,但是我们做到了

      而使用第二种get set 方式,我们就能很容易的在其中进行检测数值的正确性,以保证不会出现错误.

    {
      //... public void setAge(int age) { if(m_age < 0) throw new Exception("Wrong Age!"); m_age = age; } }

      这个时候进行赋值操作就会抛出异常了:

    Person p = new Person()
    p.setAge(-5);    //throw Exception!!!

       .Net只是将这种繁琐的过程封装了下,于是就变成了我们经常使用的属性了.本质上,编译器编译时还是会解压缩代码成为get set方法.

      三个主要的原因让我们使用Get Set 方法或者属性,而不是直接暴露字段

      1.希望访问或者设置字段的时候执行一些其他关联操作,比如:延迟加载,缓存取值等;

      2.希望以线程安全的方式访问字段(内部手动实现);

      3.字段可能只是一个逻辑值,通过计算得到,比如:有长度和宽度两个字段,只需要设置一个只读的面积属性就可以通过计算得到其值.

      有参属性 ---- 索引器

      我不打算讨论这块内容,我从学习C#以来从没有用到过,也很少或者说没有在其他人的代码中见识到使用索引器的.我只能说这个东西对我来说太鸡肋了,所有他能做到的,你通过方法都能做到,而且代码的可阅读性和可理解性比这个要好上N多倍.

      所以归根到底,属性就是语法糖,封装了Get Set 方法,Over.

  • 相关阅读:
    Linux 用户和用户组配置文件
    Linux su和sudo的区别
    4-selenium-xpath定位
    3-selenium-元素定位
    1-selenium3安装
    vim 查看行数
    java学习day27-JavaScript
    java学习day26-CSS定位
    java学习day26-CSS(2)-布局+属性
    java学习day26-CSS(1)
  • 原文地址:https://www.cnblogs.com/woodywu/p/3266776.html
Copyright © 2020-2023  润新知