【c# 学习笔记】封装

    封装 指的是把类内部的数据隐藏起来,不让对象实例直接对其操作。c#中提供了属性机制来对类内部的状态进行操作。

  在c#中,封装可以通过Public、Private、Protected和Internal等关键字来体现。

    为什么要将类内部的数据封装起来?如下:

    

    //不使用封装特性来定义一个Person类
    public class Person
    {
        public string _name;
        public int _age;
    }

   当把字段定义为公共类型时,外部对象可以对类内部的数据进行任意的操作,很可能导致当前值不符合系统的业务逻辑。如下:

  

        static void Main(string[] args)
        {

            Person p = new Person();
            p._name = "肖烨";

            //-5赋值给age字段显然是不符合业务逻辑的,人的年龄不可能为负。
            p._age = -5;

            Console.Read();
        }

  如上代码中,尽管把-5赋给Person的_age属性没有引起编译错误,但这并不符合业务逻辑,因为在现实生活中,人的年龄不可能为负值。当我们把类的字段

定义为公共类型时,外部对象可以直接对类内部的数据进行操作,此时无法对这些操作进行一些逻辑判断,这就是公共数据的问题所在。

  面向对象编程中的封装特性,是一种保护状态数据完整性的方法,在面向对象编程中,应更多地定义私有数据字段。c#提供属性机制来对这种私有字段数据

进行间接的操作,并且可以在属性的定义中加入更多的逻辑判断。利用封装技术,我们可以有效地对外部隐藏类内部的数据,从而避免数据损坏。如下演示:

    public class Person
    {
        private  string _name;
        private  int _age;

        public string Name
        {
            get { return _name; }
            set {_name = value ; }
        }

        public int Age
        {
            get { return _age; }
            set
            {
                //在属性定义中,可以根据系统的业务逻辑添加逻辑代码

                if(value < 0 || value >120)
                {
                    throw (new ArgumentOutOfRangeException("AgeIntPropery", value, "年龄必须在0-120之间"));
                    _age = value;
                }
            }
        }
    }

  使用了封装技术之后,外部数据只能对属性进行操作。如果把不符合逻辑的值赋给属性Age,就会在运行时抛出异常,客户端调用可以通过捕获该异常,进行

相关的错误处理操作。

猜你喜欢

转载自www.cnblogs.com/xiaoyehack/p/9209192.html