使用属性而不是可访问的数据成员

属性是 C# 中的一等公民。 借助该语言所定义的语法,开发人员能够编写出准确表达其设计意图的代码。属性作为一种全功能的、第一等的语言元素,能够以方法调用的形式访问或修改内部数据。成员函数中可以实现的功能均可以在属性中实现。访问属性时,其行为类似于字段。 但与字段不同的是,属性通过访问器实现;访问器用于定义访问属性或为属性赋值时执行的语句。
1、如一个对象里有一个 name 数据成员,如果在日后对这个字段产生新的需求时就不会查找每个会用这个 name 的代码并逐一修复。
例:

public class Class1
    {
        private string name;
        public string Name
        {
            get { return name; }
            set
            {
                //增加对输入 name 修改的验证
                if (string.IsNullOrWhiteSpace(value)) throw new ArgumentException("参数不能为空", "Name");
                name = value;
            }
        }
    }
在这里插入代码片

因为属性是使用方法来实现的,所以要添加多线程的支持也非常简单:

public class Class1
    {
        private Object synHandle = new object();
        private string name;
        public string Name
        {
            get
            {
                lock (synHandle)
                    return name;
            }
            set
            {
                //增加对输入 name 修改的验证 
                //增加对输入 name 修改的验证
                if (string.IsNullOrWhiteSpace(value)) throw new ArgumentException("参数不能为空", "Name");
                lock (synHandle)
                    name = value;

            }
        }
    }

属性访问器作为二个独立的方法编译到你的类型中。你还可以为get\set 访问器制定不同的访问权限,这样即可更精妙的控制作为属性暴露出的数据成员的可见性。若类型需要包含并暴露出可索引的项目,那么还可以使用索引器。索引器和单一条目属性的着同样的语言支持:它们都是作为方法实现的,国此可以在索引器内部实现任意的验证可计算逻辑。索引器也可以为虚的或抽象的,可以声明在接口中,可以为只读或读写。一维且使用数字作为参数的索引器也可参与数据绑定。由于C#不支持为索引器命名,在使用时索引器都需要用 this 关键字声明,所以在使用时每个不同的索引器都必须有不同的参数列表。
一维:

public Address this[string name]
        {
            get { return addressValue[name]; }
            set { addressValue[name] = value; }
        }

多维:

public int this[int x, int y]
        {
            get { return ComputeValue[x,y]; }
        }

        public int this[int x, string name]
        {
            get { return ComputeValue[x, name]; }
        }

比较属性和数据成员的性能上说,数据成员当然比属性访问快,但也快不了多少。JIT编译器将内联一些方法调用,包括属性访问器。当JIT编译器内联了属性访问器时,数据成员和属性的访问效率就可持平。即使某个属性访问器没有被内联,其性能差距也实在是微乎其微,仅仅一次函数调用之别而已。
因此我们无论何时需要在类型的公有或保护接口中暴露数据,都应该使用属性、使用索引器来暴露序列或字典。所有的数据成员都应该是私有的,没有任何例外。这样你就立即得到了数据绑定的支持,也便于日后对方法实现的各种修改。对于将任何变量封装到一个属性所需的额外输入工作其实不会占用太多时间,而日后若需要使用属性来更正设计,则会花去大量的时间。现在多投入一点点,换来的是今后维护时间的更加游刃有余。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值