漫话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.

转载于:https://www.cnblogs.com/woodywu/p/3266776.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值