C入门课程PPTCsharp入门课程类的属性.ppt

明德博学明德博学 日新笃行日新笃行 第七章 类的属性 明德博学明德博学 日新笃行日新笃行 回顾与作业点评 找出下面代码中的错误 int array new int 4 0 1 2 3 4 foreach int arryItem in array Console WriteLine arryItem 位置错误 int array new int 5 0 1 2 3 4 foreach int arryItem in array Console WriteLine arryItem 数组长度错 误 变量类型 错误 明德博学明德博学 日新笃行日新笃行 3 回顾 类和对象的区别是什么 public class char sex int age public string tostring return name t sex t age public static void Main string args Student stu new Student name 神仙姐姐 sex F age 18 Console WriteLine stu Student stu name stu sex stu age 实现输出学生信息 下面代码有哪些错误 明德博学明德博学 日新笃行日新笃行 回顾 结合上期的知识 小汽车 奔驰汽车和楼 下那辆奔驰S500汽车 哪个是类 哪个是 对象 声明一个方法不需要返回值的关键字是什 么 明德博学明德博学 日新笃行日新笃行 预习检查 创建属性通过哪两个访问器 明德博学明德博学 日新笃行日新笃行 本章任务 使用属性封装年龄字段 使用属性封装身份证字段 使用属性封装MyBank字段 实现计算一组数的奇偶个数 明德博学明德博学 日新笃行日新笃行 本章目标 掌握C 中的访问修饰符 掌握C 中的属性 明德博学明德博学 日新笃行日新笃行 生活中的访问级别 什么是访问级别 明德博学明德博学 日新笃行日新笃行 C 中的访问修饰符private 某些敏感字段只希望在类内部使用怎么办 public class Employee public double pay 3000 public void ShowPay Console WriteLine 您的工资等级是 0 payLevel Console ReadLine 不被其它类使 用 private double pay 3000 演示示例1 访问学生信息 私有成员 公有成员 明德博学明德博学 日新笃行日新笃行 示例1代码分析 关键代码回顾 public class Student 姓名 private string name 王丽丽 定义成private的字段 其 他类访问不到 class Program static void Main string args Student stu new Student stu name Lili 强制访问 无法访问编译错 误 明德博学明德博学 日新笃行日新笃行 C 中的访问修饰符 C 中的访问修饰符 访问修饰符访问权限访问级别 public不受任何限制最高 private只有类的内部可以使用最低 明德博学明德博学 日新笃行日新笃行 12 访问修饰符 2 1 Teacher 类 private 成员 protected 成员 public 成员 internal 成员 Student 类 只有 Student 类在 Teacher 类 都在同一程序集中 才可访问 internal成员 不可访问 不可访问 可以访问 明德博学明德博学 日新笃行日新笃行 13 访问修饰符 2 2 修饰饰符说说明 public 所属类的成员以及非所属类的成员都可以访问 internal 当前程序集可以访问 private 只有所属类的成员才能访问 protected 所属类或派生自所属类的类型可以访问 明德博学明德博学 日新笃行日新笃行 14 公有成员和私有成员 class student private string name 姓名 public int age 年龄 public string idNumber 身份证号 static void Main string args student myStudent new student myStudent name 张三 myStudent age 20 私有成员 公有成员 实例化一个对象 可以访问 演示示例1 访问修饰符 无法访问编译错 误 明德博学明德博学 日新笃行日新笃行 15 数据安全 static void Main string args student myStudent new student myStudent age 2 myStudent idNumber 123456 非法数据 身份证号不能被修改 无法获得数据 无法正常赋值 有时候将类中 的字段公开是 不安全的 如果设为私有成员 能否对这些字段进行规则约束或者只读呢 能否对 age设成可读且只能赋值为1 100呢 明德博学明德博学 日新笃行日新笃行 使用方法解决数据安全问题 private int age public int 方法1 return this age public void 方法2 int 参数 if 参数 100 this age 18 else this age 参数 1 使用者不可直接操作 age 2 用方法返回 age供读取 3 用方法限制使用者的非法赋值 演示示例3 使用方法限制对字段的读取 明德博学明德博学 日新笃行日新笃行 什么是属性2 1 private int age public int Age get return age set if value 100 age value else age 18 通过公有Age访问和约束私有字段 age 字段 属性 相当于方法的参数 返回 age 给 age赋值 通过get和set访问 明德博学明德博学 日新笃行日新笃行 什么是属性2 2 class Student private string name public string Name get return name set name value get用于获取 相应字段的值 set用于设置 字段的值 只有get时 只读属性 只有set时 只写属性 get和set都存在 读写属性 可以是任何数据类型 但类型必须一致 明德博学明德博学 日新笃行日新笃行 属性的使用 myStudent Age 20 输出 myStudent Age 40 输出 没有访问age 录入非法数据 输出myStudent Age 演示示例4 用属性限制对字段的读取 明德博学明德博学 日新笃行日新笃行 属性的作用 private int age public int Age get return age set if value 100 age 18 else age value 控制私有字段的可访问性 保护内部数据的安全 建议 类内部敏感字段使用 属性来控制访问 明德博学明德博学 日新笃行日新笃行 封装字段 将类中的字段 属性绑到一起 封装字段 避免非法数据的访问 保证数据的完整性 操作演示 在VS中使用重构 封装字段 封装是面向对象的三大特性之一 明德博学明德博学 日新笃行日新笃行 类的成员 类的成员与类的关系示例 手机类 字段类中的数据手机的SIM卡 属性类的状态手机的颜色 型号 方法类的行为显示短信 播放音乐铃声 我们学习了哪些类的成员 明德博学明德博学 日新笃行日新笃行 小结 参考答案 使用属性封装身份证号字段并使用输出语句 测试 身份证号必须为18位 否则重置为 0000 0000 0000 0000 00 明德博学明德博学 日新笃行日新笃行 练习 使用属性封装MyBank字段 需求说明 使用属性封装User里的所有字段 User成员字段 账户名 密码 身份证号 账户余额 账号 行为方法 取款操作 存款 完成时间 10分钟 明德博学明德博学 日新笃行日新笃行 使用属性 属性与字段 变量一样 用于表达式中 进行取值或赋值 例 如 Console WriteLine 已创建半径为 aCircle Radius 的圆 Console WriteLine 目前圆对象个数为 Circle NumCircles 在所在类的外部使用属性 也要加上前缀 实例属性 要用对象名作前缀 例如 aCircle Radius 静态属性 要加上类名作前缀 例如 Circle NumCircles 在所在类的内部使用属性 可以不加前缀 也可以加上前缀 读取属性值时 程序执行属性get访问器中的代码 属性赋值时 程序执行属性set访问器中的代码 所赋的新值自 动传给内建的value参数 明德博学明德博学 日新笃行日新笃行 属性的局限 1 除了get set访问器之外 属性不能 包含其他并列的代码块 2 除了set访问器内建的value参数 get set访问器不能获取别的参数 3 不能声明const属性 4 不能将属性作为一个ref或out参数 但字段可以 明德博学明德博学 日新笃行日新笃行 自动实现属性 系统提供了自动生成属性set和get访问器代码块的机制 自动实现属性的一般形式 访问修饰符 可选static 类型 属性名 get set 自动实现的属性必须同时声明get和set访问器 如果要创建 只读的自动实现属性 则可声明private的set访问器 例 建立控制台应用程序项目 编写能自动实现属性的矩 形类 计算矩形面积和周长 统计矩形对象个数 class Rectangle 自定义矩形类 public double Length get set public double Width get set public static int NumRectangles get private set 明德博学明德博学 日新笃行日新笃行 在Program类中编写Main方法代码 string String double length width area girth while true Console Write 请输入矩形的长度 直接按回车键退出程序 String Console ReadLine if String break else Rectangle aRectangle new Rectangle length width Console WriteLine 已创建矩形对象个数 Rectangle NumRectangles 明德博学明德博学 日新笃行日新笃行 自动实现的属性 自动实现的属性 编译时自动生成了对应的私有字段及访问 器代码 例如例7 6的矩形长度属性 public double Length get set 编译时系统在类Rectangle内部自动生成了如下代码 private double length public double Length get return length set length value 自动实现的属性 由系统生成的访问器代码块语句是很简单 的 不可能包含复杂的逻辑功能 明德博学明德博学 日新笃行日新笃行 例7 7 建立控制台应用程序项目 编写在长度和宽 度属性中限制出现负数的矩形类 修改例7 6项目中的矩形类Rectangle 部分代码如下 private double length width 私有的矩形长度 宽度字段 public double Length 长度属性 get return length set if value 0 throw new Exception 矩形的长度不能为负数 else length value public Rectangle double length double width 构造函数 Length length Width width NumRectangles 明德博学明德博学 日新笃行日新笃行