资源描述
单击此处编辑母版标题样式,*,单击此处编辑母版文本样式,第二级,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,用对象思考:值类型和引用类型,1,回顾,class Student,private string Study(string name),private int Study(string name),属性中get和set访问器可以单独存在么?,返回值不同的两个方法不能重载,2,预习检查,结构是值类型还是引用类型?,结构是否可以添加无参的构造函数?,3,本章任务,分别用结构和类实现Student对象,体会值类型与引用类型的区别,4,熟练掌握常量、枚举、结构的使用,理解值类型与引用类型的概念,理解值类型与引用类型作为参数时的区别,本章目标,5,数据类型回顾,常用的数据类型有哪些?,真假判断,姓名,成绩,年龄,举例,bool,布尔型,string,字符串,float,浮点型,int,整型,C#,常用数据类型,6,为什么使用常量,public 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,在类中被修改,?,7,常量,常量在使用过程中值不会发生变化,常量程序中反复使用,const,类型 常量名 = 常量值,程序中不会被改变,static void Main(string args),const,int PI = 3.14;,PI,= 3.20;,强制赋值会发生错误,常量名通常使用大写,8,随意赋值的危险,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类添加性别的属性,用常量赋值,有违常理,非法数据,演示示例1:,MyEnum,9,什么是枚举,用一种新的类型定义,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是一个,枚举类型,代码错误,10,枚举定义,枚举是一组描述性的名称,枚举定义一组有限的值,不能包含方法,对可能的值进行约束,枚举允许描述性名称表示整数值,访问修饰符 enum 枚举名 值1,值2 ,public enum Accp,S1,S2,Y2,我们不会输入S3,Y3,public enum Accp,S1=1 ,S2=2 ,Y2=3,/,Console.WriteLine(S2,的整数值是,0.,(int)(Accp.S2),);,枚举表示的整数值取得方法,11,枚举与其它类型的转换,枚举转换为字符串,字符串转换为枚举,public enum Accp,S1 ,S2,Y2,/,Console.WriteLine(S2,的值是,0.,Accp.S2.ToString(),);,(Accp)(Enum.Parse(typeof(Accp),S2);,需要转换的字符串,12,枚举的特点,汽车类有一个成员是车身颜色,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.WriteLine(,我要选择的颜色是,:0, color.red);,枚举,13,枚举的典型应用,DialogResult choice;,choice = MessageBox.Show(,确定要退出吗?, ,退出系统,MessageBoxButtons.OKCancel, MessageBoxIcon.Information);,if(choice = DialogResult.OK),Application.Exit();,DialogResult是个枚举,指示对话框的返回值,这样我们就不会判断一些非法的值,导致系统异常,14,为什么需要结构,有很多预定义颜色,正常人眼可分辨的颜色种类可达几十万种以上,Color提供使用RGB值返回颜色的方法,FromArgb(),System.Drawing.Color,有很多颜色值,它是一个枚举吗?,System.Drawing.Color是一个,结构,15,结构定义,结构中有属性,也可以有方法,public struct,StructStudent,public string name;,public int Age;,public string Hobby;,public int Popularity;,public void SayHi(),.,访问修饰符,struct,结构名,定义结构成员,构成和类相似,定义成员变量不能赋初值,成员方法,16,StructStudent myStu;,myStu.Age = 20;,myStu.Gender = Genders.Female;,myStu.Hobby = ,唱歌,;,myStu.Name = ,张靓靓,;,myStu.Popularity = 100;,myStu.SayHi();,结构的使用2-1,定义结构可以不用new,为结构成员赋值,调用结构的方法,运行结果和类的SayHi相同,17,StructStudent myStu =,new StructStudent(,张靓靓, Genders.Female, 20, ,唱歌, 100);,myStu.SayHi();,结构的使用2-2,struct StructStudent,public StructStudent(string name, Genders gender, int age,string hobby, int popularity),this.Name = name;,this.Gender = gender;,可以有构造函数,只能声明有参数的构造函数,构造函数传参,18,理解结构与类的区别,都可以实现接口,都可以包含字段、方法,相同点,结构中给字段赋值是错误的,类中可以给字段赋值,创建对象可以不用,new,创建对象必须使用,new,可以添加构造函数,但它们必须带参数,可以添加无参的构造函数,不可以有默认构造函数,可以有默认构造函数,不能被继承,可以被继承,值类型,引用类型,不同点,结构,类,19,值类型与引用类型,使用类版Student和结构版Student实现下面操作,static void Main(string args),/使用值类型,StructStudent student1 = new StructStudent();,StructStudent student2 = new StructStudent();,student1.Age = 18;,student2 = student1;,student2.Age = 20;,Console.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,student2.Age);,20,值类型,值类型直接存储值,Age=18,student1,student1,studnet2,student1.Age = 18,Age=18,Age,student2 = student1,student1.Age,student1,studnet2,Age=18,Age=20,student2.Age = 20,21,引用类型,student1,student1.Age = 18,Age=18,引用类型存储对值的引用,student1,studnet2,student2 = student1,student1.Age,两个变量都发生变化,Age=20,student1,studnet2,student2.Age = 20,22,拆箱和装箱,值类型和引用类型之间的转换,值类型,引用类型,装箱,拆箱,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;,/,拆箱,与值类型的变量类型要一致,23,值方式的参数的传递,值传递方式传递值类型:,结构: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:,MySchool,24,值方式的参数的传递,值传递引用类型时:,类:Student,参数在程序中被修改,/,传递引用类型参数,Student scofield =,new Student(Scofield, Genders.Male, 28, ,越狱狱,);,scofield.SayHi();,Vote(scofield);,scofield.SayHi();,引用类型:类,人气属性加1的方法,人气加1,25,引用方式传递,传递值类型,传递引用类型,ref方式传递完全修改,private void Vote(ref StructStudent stu),stu.Popularity+;,ref引用方式传递参数,演示示例6:,MySchool,26,值类型和引用类型细分,数组:,int,string,数组,接口:,interface,接口,自定义类:,class,字符串:,string,基类:,System.Object,类,引用类型,结构:,struct,结构类型,枚举:,enum,枚举类型,布尔型:,bool,字符型:,char,浮点型:,float,长整型:,long,整型:,int,基本数据类型,值类型,描述,类别,27,传递数组,数组是值类型还是引用类型,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,参数被修改,数组是引用类型,28,数组属性,建立班级类包含多个学员,访问学员对象,MyClass1 myClass1 = new MyClass1(T01);,myClass1.Students2.SayHi();,通过索引访问,数组属性,演示示例7:,MyArray,29,什么是索引器,能否通过姓名访问学员?,public Student thisint index,get return studentsindex; ,学生类中添加,/,采用索引器的方式,MyClass myClass = new MyClass(T01);,myClass.Students2.SayHi();,myClass.Students,周杰杰,.SayHi();,可以按照索引访问,重载的索引器根据姓名查找学员,演示示例8:,MySchool,30,索引器的特点,DataRow,列名,DataReader,列名,数组属性只能根据下标(索引)来访问,索引器可以被重载,可以使用更灵活的方式访问,定义访问方式,我们以前用过的索引器,31,类图,VS2005的类图,类图描述类的结构,查看一个类的类图,“锁”表示私有,不同字段有不同的图标,32,通用的类图,- age:int,- name:string,+ Name:string,类名Student,+SayHi():void,“-”表示私有,“+”表示公有,“:”后是变量类型,“:”后是返回类型,读懂类图是OOP的基本要求,33,总结,常数在程序中可以被修改吗?,枚举中可以有方法吗?,简述类和结构的区别?,值类型和引用类型间的转换称为什么?,通用的类图中私有成员用什么表示?,34,
展开阅读全文