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里控制。
- C#回顾学习笔记十九:类和对象
- C#回顾学习笔记二十九:new关键字隐藏父类的方法
- C#回顾学习笔记三十二:密封类和密封方法
- C#回顾学习笔记十八:面向对象是什么
- Objective-C学习笔记(十九)——对象方法和类方法的相互调用
- C#回顾学习笔记十六:out、ref和params参数
- C#回顾学习笔记二十八:装箱和拆箱
- java学习笔记(十九)对象数组
- JavaScript学习笔记十九:标准对象-RegExp
- C#回顾学习笔记三十一:抽象类与抽象方法
- C#回顾学习笔记三十三:partial部分类
- C#学习笔记(三):面向对象和类
- C#回顾学习笔记二十一:面向对象的继承特征
- C#回顾学习笔记十二:三元表达式
- C#回顾学习笔记三十四:接口
- C#回顾学习笔记三十九:事务
- C#回顾学习笔记四十:三层架构
- 类和对象知识点回顾
- tp5的excel导出功能
- [BZOJ]2462: [BeiJing2011]矩阵模板 二维hash
- Qualcomm Simlock——启动检测流程
- android AIDL使用全解
- TP5 url链接(带参数)的写法
- C#回顾学习笔记十九:类和对象
- 关于String类型变量的比较问题
- python try except 捕获所有异常
- Spring及其优点
- CS Academy Round #49 A, B, C
- 《深入理解Java虚拟机》——Java内存区域与内存溢出异常学习总结
- 冷静一下,openwrt之总结
- Unity技巧总结02 GUI绘制 Loading遮罩
- Jvisualvm监控远程linux下Tomcat