C#回顾学习笔记十九:类和对象

来源:互联网 发布:mac删除应用程序还在 编辑:程序博客网 时间:2024/06/07 03:54

为什么要使用类?引入类(Class)和对象(Object)的概念后的好处是:

1.让代码变得更加干净彻底

2.方便程序的开发,方便维护代码和修改代码。

3.当然还有很重要的一点是,让程序员都可以读懂代码的意思。

在讲类和对象的概念前,先来看看平时我们如何用代码统计学生各科成绩的总分:

class Program    {        static void Main(string[] args)        {            string name = "小李";            int Chinese = 97;            int English = 89;            int math = 73;            scoreSum(name, Chinese, English, math);            Console.ReadKey();        }        static void scoreSum(string name, int Chinese, int English, int math)        {            Console.WriteLine("{0}同学的总分是{1}", name, Chinese + English + math);        }    }
问题1,现在如果要增加一个学生,这意味着在主函数中又要写string name2="小王"; 然后再声明一大堆变量来保存新同学的分数,再调用方法完成统计。主函数内随着同学的增加,要声明的变量也在成批量增加,可能到后面都不知道这个变量究竟是哪个同学的。

问题2,如果要统计成绩的科目又增加了五个,这意味着scoreSum()方法要传入的参数又增加了五个,这样的代码看上去很乱很不容易维护和修改。

引入类和对象的概念后,对上面的代码做一下修改:

第1步,在项目上右键-添加-类,新建一个名字叫Student.cs的类。

第2步,在Student类中添加这样的代码:

class Student    {        private string _name;        public string Name        {            get { return _name; }            set { _name = value; }        }        private int _chinese;        public int Chinese        {            get { return _chinese; }            set { _chinese = value; }        }        private int _english;        public int English        {            get { return _english; }            set { _english = value; }        }        private int _math;        public int Math        {            get { return _math; }            set { _math = value; }        }        public void scoreSum()        {            Console.WriteLine("{0}同学的总分是{1}", this.Name, this.Chinese + this.English + this.Math);        }    }
别看这段代码很长,实际上这是一件一劳永逸的事情。

第3步,主函数代码修改为:

class Program    {        static void Main(string[] args)        {            Student xiaoli = new Student();            xiaoli.Name = "小李";            xiaoli.Chinese = 97;            xiaoli.English = 89;            xiaoli.Math = 73;            xiaoli.scoreSum();            Console.ReadKey();        }    }
这时候执行程序,就会发现输出的结果跟上面的结果一样。这时候如果要增加一个学生的话,只需要在主函数按照声明xiaoli对象的操作重复一遍就行了:

class Program    {        static void Main(string[] args)        {            Student xiaoli = new Student();            xiaoli.Name = "小李";            xiaoli.Chinese = 97;            xiaoli.English = 89;            xiaoli.Math = 73;            xiaoli.scoreSum();            Student xiaowang = new Student();            xiaowang.Name = "小王";            xiaowang.Chinese = 68;            xiaowang.English = 81;            xiaowang.Math = 91;            xiaowang.scoreSum();            Console.ReadKey();        }    }
===========================================

对Student.cs类中的代码做解释:

1.private string _name;这个_name表示字段,而public string Name这个Name表示属性。两个通常成对出现。标有private的字段,只能在Student类的内部访问到,而标有public的属性则可以被外部访问到。属性实际上很容易理解,比如对人来说,属性可以有:性别、年龄、姓名、身高、体重……等,对一个学生来说,属性可以有:姓名、性别、年龄、语文成绩、数学成绩……等。在代码中,类的属性需要根据实际情况来自己手写,比如这个例子中,我们只对Student类增加了姓名、语文、英语、数学的属性。

实际上在执行xiaoli.Name = "小李";时,内部自动发生了这种变化:


如图所示,Name属性作为外交官充当外部与内部的一个中转站,私有字段_name是无法被外部直接访问到的,因此不可能出现xiaoli._name = "小李";这种操作。必须对外部隐藏私有字段,不能让外部有访问到私有字段的权限。因为在Student类的内部,我们通常需要对某个属性进行取值范围的限定,如果外部能随意操控属性的取值范围,这样是很危险的。操控属性的取值范围可以这么做:


如果在主函数执行代码xiaoli.Chinese = 101;的话,因为这个条件的限制,因此最终值还是100。

2.get和set的作用是什么?get和set实际上也是方法,但在主函数中我们都没去调用过这两个方法,get和set方法是自动执行的。在执行xiaoli.Name = "小李";时是对属性的“赋值操作”,所以会自动执行set代码,把这个"小李"在内部赋值给私有字段_name保存,这样xiaoli这一个实例化的对象就实实在在拥有了"小李"这个值。在从对象里取出值使用时,会自动执行get方法,比如在scoreSum()方法内的this.Name就是从xiaoli这个对象中调用出Name属性的值,而这个工作就是get方法完成的。

补充:

1.this关键字表示当前对象,在执行xiaoli.scoreSum();时,因为调用这个scoreSum()方法的对象是xiaoli,因此this就代表xiaoli这个对象。这意味着this代替l 当前调用方法的对象,因此可以从对象中获取相同的属性值。

2.实际上,类的属性还有更简单的写法,这种写法叫“自动属性”,对上面的Student.cs类进行改造,代码变少了但功能依然存在:

class Student    {        public string Name { get; set; }        public int Chinese { get; set; }        public int English { get; set; }        public int Math { get; set; }        public void scoreSum()        {            Console.WriteLine("{0}同学的总分是{1}", this.Name, this.Chinese + this.English + this.Math);        }    }

3.为什么要用get{}和set{}?首先基于面向对象的原则来说,面向对象编程要做到抽象、封装。变量是对类本身而言的,我们把它叫做域,可以是public或者private,属性是累的外部显示特征,虽然域可以为public,但这样不利于类的封装,因为外部使用者可以对类进行直接修改。所以就需要用到属性,我们只公开属性,至于如何对其进行赋值(set操作)和取值(get操作)都已经进行了封装,外部只能使用它而不能控制它。C#的属性充分体现了对象的封装性:不直接操作类里面的数据,而是通过访问器来访问。借助于get和set对属性进行存和取的操作。并且还可以巧妙利用get和set来控制只读和只写。比如对属性只有get就是只读,对属性只有set就为只写,这样做非常方便,或者在get和set内加上对取值范围限定,让执行get或set时做一下if判断,如果满足某个条件时,就修改那个值。比如年龄超过100岁时,默认让年龄为100岁,这些都可以写在get和set里控制。


原创粉丝点击