• Effective C# 学习笔记 1


    条款一:使用属性代替可访问的数据成员
    1、在C#中属性(property)在访问时候看起来是数据成员,但却是用方法实现的!可以对set访问器做参数检查!可以对属性访问添加多线程支持!
    public class Person
    {
        private string  name;
        public string Name
       {
                get
               {
                       lock(this)
                      {
                            return name;
                        }
                 }
                set
               { 
                    if(value=null||value.Length=0)
                         throw new ArgumentException("Name cannot be blank","Name");
                      name=value;
               }
       }
    }

    2、.net的数据绑定只支持属性,不支持公有数据成员。因为将数据成员直接暴露给外界不符合面向对象的设计原则!

    3、属性可以定义只读,只写,读写的属性。
    public class Person //只读的!
    {
        private string  name;
        public string Name
       {
                get
               {
                            return name;
          
                 }
       }
    }


    4、C#2.0可以用访问修饰符修饰get,set访问器因为他们在本质上都是成员函数,更好的控制属性可见性!
    public class Person
    {
        private string  name;
        public string Name
       {
                get
               {
                            return name;
                   
                 }
                protected set
                {
                      name=value;
               }
       }
    }

    5、可以定义虚属性和抽象属性!
    public class Person
    {
        private string  name;
        public virtual string Name //虚属性可以被override实现多态
       {
                get
               {
                            return name;  
                 }
                set
               { 
                      name=value;
               }
       }
    }
    public interface IPerson
    {
        string Name//抽象属性继承类型必须给出实现
       {
               get;
               set;
       }
    }

    6、用this关键字定义带参数的属性!
    int [] values;
    public int this[index]
    {
        get
        {
            return values[index];
        }
        set
        {
            values[intex]=value;
        }
    }

    7、属性和公有字段生成的IL是不同的。访问属性和共有字段的客户代码生成IL也是不同的。所以属性和共有字段在二进制上是不相容的!不能简单的将共有字段换成属性。这样必须重新编译所有用到字段的程序集!他们只在源代码层次上是兼容的!

    8、因为JIT编辑器会对短的经常调用的方法进行内联优化。(包括属性访问器)所以如果JIT内联了属性访问器。那么属性和字段的效率是没有差别的。即使不内联。效率差别也是可以忽略不计的。

    综上所述我们应该使用属性!

  • 相关阅读:
    memory addresses
    ddt ddl dml
    PHP Architecture
    disk_free_space
    SAPI
    Simple Mail Transfer Protocol
    AllowOverride None
    function &w(){}
    The History of Operating Systems
    are not called implicitly
  • 原文地址:https://www.cnblogs.com/xhan/p/872331.html
Copyright © 2020-2023  润新知