zoukankan      html  css  js  c++  java
  • 【转】编写高质量代码改善C#程序的157个建议——建议91:可见字段应该重构为属性

    建议91:可见字段应该重构为属性

    字段和属性的本质区别就是属性是方法。

    查看下面这个Person类型:

        class Person
        {
            public string Name { get; set; }
        }

    经过编译器编译后,针对属性Name实际会生成一个private字段和两个public方法:

    [CompilerGenerated]
    private string <Name>k__BackingField;
     
    [CompilerGenerated]
    public void set_Name(string value)
    {
        this.<Name>k__BackingField = value;
    }
    
    [CompilerGenerated]
    public string get_Name()
    {
        return this.<Name>k__BackingField;
    }

    可见,属性实际上是编译器给我们的语法糖。

    属性比字段具有以下的优势:

    1)可以为属性添加代码。正是因为属性是方法,所以可以在方法内对设置或获取属性的过程进行更多精细化控制。如:为属性添加NameChanged事件等。单凭字段是完成不了这样的功能的。

    2)可以让属性支持线程安全。要让属性变成线程安全的可以让类型自身去实现。而要让字段支持线程安全,就只能靠调用者本身来实现了。

    3)属性得到VS编译器的支持,还得到了实现自动属性这种功能。自动属性的特点在LINQ中得到了广泛应用,尤其是在匿名类中,它只能实现只读的自动属性,而不支持字段。

    4)从设计角度,也就是面向对象角度来看,公开的字段也应该使用属性。改变字段的状态,类型不会被通知到;而改变属性的值,类型支持则会被通知。

    综上,如果一个类型存在一个可见字段,那么他应该被重构为属性。当然,如果某个属性仅仅对内部可见,而不涉及以上4点内容,则建议使用字段。

    转自:《编写高质量代码改善C#程序的157个建议》陆敏技

  • 相关阅读:
    Android 按键消息处理Android 按键消息处理
    objcopy
    SQLite多线程读写实践及常见问题总结
    android动画坐标定义
    Android动画效果translate、scale、alpha、rotate
    Android公共库(缓存 下拉ListView 下载管理Pro 静默安装 root运行 Java公共类)
    Flatten Binary Tree to Linked List
    Distinct Subsequences
    Populating Next Right Pointers in Each Node II
    Populating Next Right Pointers in Each Node
  • 原文地址:https://www.cnblogs.com/farmer-y/p/7999301.html
Copyright © 2011-2022 走看看