1、深入 C# 数据类型,第二章,回顾与作业点评,.NET 框架结构包括哪两个部分? 公共语言运行时的核心组件? 使用VS2010,在类中快速引入命名空间的方式是什么?,预习检查,结构是值类型还是引用类型? 如何标识方法为静态方法?,本章任务,使用Visio绘制基本类图 实现项目经理给员工评分功能 实现给新购计算机编号 实现投票器,选举最佳员工,巩固类、对象、封装和方法调用 使用Visio绘制基本类图 理解结构 理解值类型和引用类型作为方法参数的区别 使用静态方法解决实际问题,本章目标,复习-类和对象,对象 现实世界存在的具体实体,皆有各自的状态和行为 类 具有相似状态和行为的集合 类是一种复杂的
2、数据类型,是将不同类型的数据和与这些数据相关的操作封装在一起的集合体 类和对象的关系,类,对象,归纳共性,类的实例化,复习-类的属性,类的属性 只读、只写 设置验证逻辑,/ / 项目经理类 / class PM private string _name; /姓名public string Nameget return _name; set _name = value; /省略其他属性 ,private int _age; /年龄 public int Age /年龄必须大于30岁 get return _age; set if (value = 30 | value = 100)_age =
3、value;else _age = 30; ,get、set访问器保障类中字段的安全,自动属性,自动属性优点:简化属性代码 适用场合:不操作字段、不设置只读、只写、验证逻辑时,/ 姓名 public string Name get; set; ,private string _name; /姓名public string Name get return _name; set _name = value; ,简化,编译器自动生成Name的私有字段,prop + tab键 + tab键,封装,面向对象三大特征之一封装 类是封装的最基本单元通过访问修饰符授权封装的好处 保证数据安全性 提供清晰的对外
4、接口 类内部实现可以任意修改,不影响其他类,封装:又称信息隐藏,指利用抽象数据类型将数据和数据的操作封 装在一起,使其构成一个不可分割的独立实体,尽可能隐藏内部的细节, 只保留一些对外接口使之与外部发生联系,类图,类图描述类的结构,VS2010的类图,“锁”表示私有,通用的类图,“-”表示私有 “+”表示公有,“:”后是变量类型,“:”后是返回类型,读懂类图是OOP的基本要求,练习绘制基本类图,需求说明 使用Visio绘制类图 项目经理类(PM) 程序员类( SE ),完成时间:15分钟,共性问题集中讲解,常见调试问题及解决办法 代码规范问题,共性问题集中讲解,复习-方法2-1,方法 表示类和
5、对象的行为 方法定义:参数、返回值、方法体,计算器 用户注册验证,值类型和引用类型,下面代码的运行结果,/使用值类型 int age1 = 18; int age2 = age1; age2 = 20; Console.WriteLine(“age1: “ + age1); Console.WriteLine(“age2: “ + age2); /使用引用类型 SE se1 = new SE(); SE se2 = new SE(); se1.Age = 18; se2 = se1; se2.Age = 20; Console.WriteLine(“SE1 的年龄为 0“, se1.Age);
6、 Console.WriteLine(“SE2 的年龄为 0“, se2.Age);,值类型存储方式,值类型直接存储值,age1=18,age1 = 18,age1=18,age2=18,age2 = age1,age1=18,age2=20,age2 = 20,age1,age1,age2,age1,age2,Age=18,引用类型存储方式,se1,se1.Age = 18,Age=18,引用类型存储对象的引用,se1,se2,se2 = se1,Age=20,se1,se2,se2.Age = 20,两个变量都发生变化,结构,需要存储学生信息,具有ID和年龄,选用哪种数据类型?,publi
7、c class Student public int id; /IDpublic int age; /年龄 ,public struct Student public int id; /IDpublic int age; /年龄 ,保存值类型字段,结构: 1、值类型 2、使用结构具有较快提取速度,结构定义,结构中有字段,也可以有方法,访问修饰符 struct 结构名 定义结构成员 ,public struct Studentpublic int id; /IDpublic int age; /年龄public void Show()Console.WriteLine(“ID:0n年龄:1“,i
8、d,age); ,字段不能直接赋初值,成员方法,Student stu; /创建学生结构stu.id = 1001; /给学号赋值stu.age = 20; /给年龄赋值stu.Show();,结构的使用,定义结构可以不用new,为结构成员赋值,调用结构的方法,Student stu; stu.id = 1001; stu.age = 20; Student stu2;stu2 = stu;,值类型,存储为新的副本 占用较多存储空间; 类:存储地址,结构是值类型,提取速度快,但是频繁的赋值操作会占用较大空间, 在开发中多数情况下都定义为类!,小结2-1,编写一个存储长方形(Rec)属性的结构
9、长(Length) 宽(Width) 实例化一个结构长方形,并计算面积,参考答案,小结2-2,C#常用值类型和引用类型,装箱和拆箱,值类型和引用类型之间的转换,值类型,引用类型,装箱,拆箱,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; / 装箱
10、int j = (int)o; /拆箱 ,与值类型的变量类型要一致,不同类型参数传递,公司通过投票选举优秀员工,每获得一投票,人气值增加1,两次的人气值不同,值方式传递引用类型,值方式传递引用类型参数 参数在方法中被修改,/传递引用类型参数 SE zhang = new SE(); /省略其他赋值 zhang.Popularity = 10; Voter voter = new Voter(); voter.Vote(zhang); MessageBox.Show(zhang.SayHi();,public void Vote(SE se) /人气值增加1se.Popularity+; ,按引
11、用传递,参数zhang在Vote()调用后发生了变化,值方式传递值类型,值方式传递值类型参数 结构:StructSE 不会被修改,/传递值类型参数 StructSE structZhang = new StructSE(); /创建SE结构 /省略其他赋值 structZhang.Popularity = 10; Voter voter = new Voter(); voter.Vote(structZhang); MessageBox.Show(structZhang.SayHi();,public void Vote(StructSE se) /人气值增加1se.Popularity+;
12、,人气加1,两次的人气值相同,参数在程序中未发生变化,值传递,引用方式传递,ref 引用方式传递值类型,传递引用类型,完全相同,public void Vote(ref StructSE se) /人气值增加1se.Popularity+; ,ref 引用方式传递参数,调用Vote()前后人气值发生变化,保留对参数的修改,数组作为参数,阅读代码,写出运行结果,int odd = 1, 3, 5 ; ArrayOpr opr = new ArrayOpr(); opr.PrintArray(odd); opr.ChangeToEven(odd); opr.PrintArray(odd);,pri
13、vate void ChangeToEven(int arr) for (int i = 0; i arr.Length; i+)arri = i * 2; ,arr0=1 arr1=3 arr2=5arr0=0 arr1=2 arr2=4,引用类型参数传递,数组是引用类型,指导项目经理评分3-1,训练要点 方法调用 引用类型作为参数 需求说明 实现项目经理给员工评分,指导项目经理评分3-2,实现思路 编写SE类 查看评分窗体中创建公有成员变量保存员工信息 SE对象数组 初始化员工信息并使用ListView控件显示 编写Init()方法和UpdateView()方法 PM类添加Judge(SE
14、 se)方法 选中某员工,双击打开评分窗体,实现事件处理方法,指导项目经理评分3-3,难点指导 ListView展示数据窗体间信息传递,完成时间:30分钟,public void UpdateView() lvAssess.Items.Clear(); /清空信息for (int i = 0; i engineers.Length; i+)ListViewItem item = new ListViewItem();item.Text = engineersi.ID;item.SubItems.Add(engineersi.Name); /设置姓名/省略设置年龄、评分、评价this.lvAss
15、ess.Items.Add(item); /添加项 ,/对选中对象评分FrmJudge frm = new FrmJudge(this,index);frm.Show();,FrmShow窗体对象,选中的SE对象的数组索引,练习生成设备ID,需求说明 为公司购买的3台不同型号的计算机进行编号 编号的规则是“计算机型号+4位随机号” 编号完毕后,输出每台计算机的信息,完成时间:15分钟,共性问题集中讲解,常见调试问题及解决办法 代码规范问题,共性问题集中讲解,为什么需要静态方法,使用DBHelper创建、关闭数据库连接,public class DBHelper private string c
16、onnString = “; /连接字符串 /获得数据库连接public SqlConnection GetConnection()SqlConnection connection = new SqlConnection(connString);return connection;/关闭数据库连接public void CloseConnection(SqlConnection connection)connection.Close(); ,特点: 1、DBHelper类方法被频繁调用 2、提供的方法是对于所有类的实例都通用的特征,类似“工具类”,静态成员,静态成员:使用static修饰符,c
17、lass 类名 public static 数据类型 变量名; public static 返回值 方法名(参数列表)方法体; ,静态成员变量,例如:定义连接字符串、员工类定义员工总数,静态成员方法,例如:定义工具类的方法,提供独立于特定对象之外的普遍功能,静态成员为一个类的所有实体所共享,它属于类,而不属于类的某个对象! 例如:太阳,静态成员的使用,调用静态成员以前使用过的静态成员 Console类实现控制台显示文本Math类获取值,类名.变量名 = XX; /给变量赋值 类名.方法名(); /调用静态方法,Console.WriteLine(“你好!“);,Console.WriteLin
18、e(Math.PI);,静态方法,静态变量,静态成员示例,public class DBHelper private static string connString = “;/获得数据库连接public static SqlConnection GetConnection()SqlConnection connection = new SqlConnection(connString);return connection; / ,应用场合:当类不会有多个对象而更像是一个公用类的时候, 或当方法或属性是“公用”信息的时候声明为静态的比较好!,常见错误,public class Student
19、public string name; /姓名public int age; /年龄public static string country = “China“; /国籍 ,class Programstatic void Main(string args)SayHi();Student stu = new Student();Console.WriteLine(“学生的国籍 :“+stu.country);public void SayHi()Console.WriteLine(“hello world!“); ,运行错误,运行错误,静态成员与实例成员,使用static修饰的成员称为静态成员
20、 使用实例对象调用的成员称为实例成员,指导实现投票3-1,训练要点 静态方法 动态加载控件 需求说明 实现给候选人投票功能 共有20个投票机会,显示已投票数和剩余投票机会,投票完毕,“投票”按钮不可用 查看候选人选票结果,指导实现投票3-2,实现思路 使用下拉列表绑定员工信息 编写Voter类Vote(SE se)方法 实现投票响应事件 动态添加控件显示投票结果 难点指导 实现投票,class Voterpublic static int clicks = 0; /投票次数public static int totalTickets = 20; /最高购票数public static void
21、 Vote(SE se) se.Popularity+; ,foreach (SE item in engineers)SE se = (SE)this.cmbpeples.SelectedItem; /获取当前选中对象if (item.ID = se.ID)Voter.Vote(item); Voter.clicks+; /静态变量clicks记录投票次数,指导实现投票3-3,难点指导 根据候选人数组动态添加窗体控件设置控件位置 窗体坐标系 设置控件位置,完成时间:30分钟,步骤: 1、创建对象: lbNameListi = new Label(); 2、设置对象属性: lbNameList
22、i.Text = mySEi.Name; 3、添加到窗体中:this.Controls.Add(lbNameListi);,lbNameListi.Location = new Point(30, startY + i * (height + 12);,共性问题集中讲解,常见调试问题及解决办法 代码规范问题,共性问题集中讲解,总结,通用的类图中私有成员用什么表示? 值类型和引用类型间的转换称为什么? 值类型和引用类型变量存储方式的区别? 简述类和结构的区别? 静态成员和实例成员的区别?,作业,课后作业 必做 教员备课时在此添加内容选做 教员备课时在此添加内容提交时间:xxx 提交形式:xxx预习作业 背诵英文单词 教员备课时在此添加内容,