属性和字段的区别和联系

问题:C#语法中针对类中数据成员的访问引见的属性和字段概念和C++相比,C++中只要属性(觉得相当于于C#中的字段),但是在运用C#过程中,假入本人要写一个类,包含几个数据成员(即字段)但是为了让外边能够访问还需求写对应的属性出来,岂不是有点费事?使用属性的优点是什么?

在C#中,我们可以非常自由的、毫无限制的访问公有字段,但在一些场合中,我们可能希望限制只能给字段赋值于某个范围、或是要求字段只能读或只能写,或是在改变字段时能改变对象的其他一些状态,这些单靠字段是无法做到的,于是就有了属性,属性中包含两个模块:set和get,set模块负责属性的写入工作,get模块负责属性的读取工作。在两个模块中都可以做一些其他操作,如在set中验证赋的值是否符合要求并决定是否进行赋值。当缺少其中一块时属性就只能读或只能写,set和get块中属性必需有一个,因为即不能读又不能写的属性是没有意义的。

    class Product   //商品类
    {
        //私有字段
        private string _Pname;   //商品名称
        private bool _IsNoEmperty;    //是否有库存
        private float _Price;     //商品单价
        private int _PCount;      //商品数量

        //属性:
        //可读写
        public string Pname
        {
            set { _Pname = value; }
            get { return _Pname; }
        }

        //只读
        public bool IsNoEmperty
        {
            get { return _IsNoEmperty; }
        }

        //可检测赋值是否正确

        public float Price
        {
            set
            {
                if (value >= 0)
                    _Price = value;
                else
                    throw new Exception("Price的赋值范围");
            }
            get
            {
                return _Price;
            }
        }

        //赋值时更改其他状态
        public int PCount
        {
            set
            {
                _PCount = value;
                _IsNoEmperty = true;   //改变了_IsNoEmperty字段的值
            }
            get { return _PCount; }
        }
public void Print() { Console.WriteLine("产品信息如下:"); Console.WriteLine("产品名称:{0}",_Pname); Console.WriteLine("产品价格:{0}", _Price); Console.WriteLine("库存数量:{0}", _PCount); Console.ReadLine(); } static void Main(string[] args) { Product P1=new Product(); P1.Pname="黑人牙膏(克)"; P1.Price=5; P1.PCount=20; P1.Print(); } }

小结:引入属性的优点

1.维护私有字段(保证类的封装性)

2.可控制访问(只读/只写,确保赋值的正确性等)

3.不用注重细节(直接使用,不需要考虑复杂的处理代码)

至于引入属性的益处在更多的c#程序中会领会的愈加深入

问题:什么情况下选择使用字段还是属性?

从例子中可看到属性其实就是对私有字段的读取和写入,以便做些公有字段无法完成的任务,他的使用方式和公有字段完全一样,所以可以理解成属性是为了满足对公有字段的特殊需求而产生的附属品。因而当我们选择使用属性还是使用字段时,主要看需求,如果不需设置访问权限、不需在赋值时检测值是否满足要求、不需要在赋值时修改对象其他一些状态等特殊的需求时,使用公有字段即可,否则就使用属性。

posted @ 2016-04-03 23:17  每天进步多一点  阅读(2127)  评论(0编辑  收藏  举报