用对象思考:值类型和引用类型.ppt_第1页
用对象思考:值类型和引用类型.ppt_第2页
用对象思考:值类型和引用类型.ppt_第3页
用对象思考:值类型和引用类型.ppt_第4页
用对象思考:值类型和引用类型.ppt_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第七章,用对象思考:值类型和引用类型,回顾,class Student private string Study(string name) / private int Study(string name) / ,属性中get和set访问器可以单独存在么?,返回值不同的两个方法不能重载,预习检查,结构是值类型还是引用类型? 结构是否可以添加无参的构造函数?,本章任务,分别用结构和类实现Student对象 体会值类型与引用类型的区别,熟练掌握常量、枚举、结构的使用 理解值类型与引用类型的概念 理解值类型与引用类型作为参数时的区别,本章目标,数据类型回顾,常用的数据类型有哪些?,为什么使用常量,pu

2、blic class Compute double pi = 3.14; /计算圆的周长 public double Perimeter(double radius) return 2 * pi * radius; /计算圆的面积 public double Area(double radius) return pi * radius * radius; ,这个类中,会反复使用pi,如果pi在类中被修改了,计算结果错误,如何避免pi在类中被修改?,常量,常量在使用过程中值不会发生变化 常量程序中反复使用,const 类型 常量名 = 常量值,程序中不会被改变,static void Main(

3、string args) const int PI = 3.14; PI = 3.20; ,强制赋值会发生错误,常量名通常使用大写,随意赋值的危险,const string GENDER_M = 男; const string GENDER_F = 女; / 性别 private string gender; public string Gender get return gender; set gender = value; ,用常量给属性赋值: student.Gender = GENDER_M;,也可以这样给属性赋值: student.Gender = ACCP;,为Student类添加

4、性别的属性,用常量赋值,有违常理,非法数据,演示示例1:MyEnum,什么是枚举,用一种新的类型定义enum,public enum Genders Male, Female / 性别 private Genders gender; public Genders Gender get return gender; set gender = value; ,这样给属性赋值: student.Gender = Genders.Male;,如果这样属性赋值: student.Gender = ACCP;,类型不同不能赋值,性别属性的类型,Genders是一个枚举类型,代码错误,枚举定义,枚举是一组描

5、述性的名称 枚举定义一组有限的值,不能包含方法 对可能的值进行约束 枚举允许描述性名称表示整数值,访问修饰符 enum 枚举名 值1,值2 ,public enum Accp S1,S2,Y2 ,我们不会输入S3,Y3,public enum WeekDays S1=1,S2=2,S3=3 / Console.WriteLine(的整数值是0.,(int)(Accp.S2);,取得枚举表示的整数值,枚举与其它类型的转换,枚举转换为字符串 字符串转换为枚举,public enum Accp S1 ,S2,Y2 / Console.WriteLine(S2的值是0.,Accp.S2.ToStrin

6、g();,(Accp)(Enum.Parse(typeof(Accp),S2);,需要转换的字符串,枚举的特点,汽车类有一个成员是车身颜色,static void Main(string args) string color = new string red, black, write ; Console.WriteLine(我要选择的颜色是:0,color0); ,使用时,必须了解数组的构成,枚举可以用描述性的名称表示值,使用时无需了解它的构成,private enum color red,write,black static void Main(string args) Console.W

7、riteLine(我要选择的颜色是:0, color.red); ,枚举,枚举的典型应用,DialogResult choice; choice = MessageBox.Show(确定要退出吗?, 退出系统, MessageBoxButtons.OKCancel, MessageBoxIcon.Information); if(choice = DialogResult.OK) Application.Exit();,DialogResult是个枚举,指示对话框的返回值,这样我们就不会判断一些非法的值,导致系统异常,为什么需要结构,有很多预定义颜色,正常人眼可分辨的颜色种类可达几十万种以上

8、Color提供使用RGB值返回颜色的方法 FromArgb(),System.Drawing.Color有很多颜色值,它是一个枚举吗?,System.Drawing.Color是一个结构,结构定义,结构中有属性,也可以有方法,public struct StructStudent public string Name; public int Age; public string Hobby; public int Popularity; public void SayHi() / . ,访问修饰符 struct 结构名 定义结构成员 ,构成和类相似,定义成员变量不能赋初值,成员方法,/ Str

9、uctStudent myStu; myStu.Age = 20; myStu.Gender = Genders.Female; myStu.Hobby = 唱歌歌; myStu.Name = 张靓靓; myStu.Popularity = 100; myStu.SayHi(); /,结构的使用2-1,定义结构可以不用new,为结构成员赋值,调用结构的方法,演示示例2:MyStruct,运行结果和第二章的SayHi相同,/ StructStudent myStu = new StructStudent(张靓靓, Genders.Female, 20, 唱歌歌, 100); myStu.SayH

10、i(); /,结构的使用2-2,struct StructStudent / public StructStudent(string name, Genders gender, int age, string hobby, int popularity) this.Name = name; this.Gender = gender; / ,可以有构造函数,只能声明有参数的构造函数,构造函数传参,理解结构与类的区别,小结,编写一个存储老师属性的结构 结构名称TeacherStruct 姓名(teacherName) 年龄(teacherAge) 参加工作的年限(yearsOfService) S

11、ayHi方法(大家好,我是某某老师。我已经在教育战线奋斗了 几年了) 调用这个结构显示它的数据,参考答案,值类型与引用类型,演示示例3:MySchool,使用类版Student和结构版Student实现下面操作,static void Main(string args) /使用值类型 StructStudent student1 = new StructStudent(); StructStudent student2 = new StructStudent(); student1.Age = 18; student2 = student1; student2.Age = 20; Consol

12、e.WriteLine(student1 = 0,student2 = 1, student1.Age, student2.Age); ,static void Main(string args) /使用引用类型 Student student1 = new Student(); Student student2 = new Student(); student1.Age = 18; student2 = student1; student2.Age = 20; Console.WriteLine(student1 = 0,student2 = 1, student1.Age, student

13、2.Age); ,值类型,值类型直接存储值,Age=18,student1,student1,studnet2,student1.Age = 18,Age=18,Age=18,student2 = student1,student1.Age,student1,studnet2,Age=18,Age=20,student2.Age = 20,引用类型,student1,student1.Age = 18,Age=18,引用类型存储对值的引用,student1,studnet2,student2 = student1,student1.Age,两个变量都发生变化,Age=20,student1,s

14、tudnet2,student2.Age = 20,拆箱和装箱,值类型和引用类型之间的转换,值类型,引用类型,装箱,拆箱,static void Main(string args) int i = 123; object o = i; / 装箱 i = 456; /改变i的内容 Console.WriteLine(值类型的值为 0, i); Console.WriteLine(引用类型的值为 0, o); ,static void Main(string args) int i = 123; object o = i; / 装箱 int j = (int)o; ,/ 拆箱,与值类型的变量类型要

15、一致,演示示例4:拆箱装箱,值方式的参数的传递,值传递方式传递值类型: 结构:StructStudent 不会被修改,/传递值类型参数 StructStudent scofield = new StructStudent(Scofield, Genders.Male, 28, 越狱狱); scofield.SayHi(); Vote(scofield); scofield.SayHi();,private void Vote(StructStudent stu) stu.Popularity+; ,人气属性加1的方法,人气加1,两次的人气值相同,参数未发生变化,值传递,演示示例5:MyScho

16、ol,值方式的参数的传递,值传递引用类型时: 类:Student 参数在程序中被修改,/传递引用类型参数 Student scofield = new Student(Scofield, Genders.Male, 28, 越狱狱); scofield.SayHi(); Vote(scofield); scofield.SayHi();,引用类型:类,人气属性加1的方法,人气加1,引用方式传递,传递值类型,传递引用类型,ref方式传递完全修改,private void Vote(ref StructStudent stu) stu.Popularity+; ,ref引用方式传递参数,演示示例6

17、:MySchool,值类型和引用类型细分,传递数组,数组是值类型还是引用类型,/ int odd = 1, 3, 5 ; PrintArray(odd); ChangeToEven(odd); PrintArray(odd); /,private void ChangeToEven(int arr) for (int i = 0; i arr.Length; i+) arri = i * 2; ,值方式传递,arr0=1 arr1=3 arr2=5 arr0=0 arr1=2 arr2=4,参数被修改,数组是引用类型,演示示例7:MyArray,数组属性,建立班级类包含多个学员,访问学员对象,MyClass1 myClass1 = new MyClass1(T01); myClass1.Students2.SayHi();,通过索引访问,数组属性,什么是索引器,能否通过姓名访问学员?,public Student thisint index get return studentsindex; ,Students类中添加,/采用索引器的方式 MyClass myClass = new MyClass(T01); myClass.Students2.SayHi(); myClass.Students周杰杰.SayHi(); ,可以按照索引访问,重载的索引器根据姓名查找学员,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论