学习日报 1026 使用属性升级MyBank

访问修饰符

理解访问修饰符

  • 公开的与私有的

    • 任何对象都会有公开的一面
    • 任何对象也会有私有的一面
  • 餐厅的大厅与后厨

    • 大厅是公开的,食客随意走动
    • 后厨是私有的,后厨重地,闲人免进
  • 填表:女人的身高与年龄

    • 填写问卷调查时
    • 女人的身高无法隐藏,一般公平的写
    • 年龄与体重等信息比较敏感,能不填就不填
    • 以上情况适宜于上年纪体重大的女性

公开的与私有的

  • 演练,体验public与private

    • 定义一个类,类中定义属性,不给访问修饰符

      学习日报 1026 使用属性升级MyBank_字段

    • 实例化这个类为一个对象,给这个对象赋值,会有提示弹出

      如果类中的属性没有提供访问修饰符的时候
      这个类所实例化出来的对象
      的属性
      不可以在另一个文件中被使用

      学习日报 1026 使用属性升级MyBank_字段_02

    • 给这类的属性添加public访问修饰符后,正常运行

      学习日报 1026 使用属性升级MyBank_字段_03

      学习日报 1026 使用属性升级MyBank_初始化_04

    • 结论?

      • 类中定义的属性,我在类的外部无法直接操作。原是,受保护级别的限制
      • 解决这种限制,给类的属性定义的时候,前面加上public访问修饰符。表达一个,该属性是公开的属性。
    • 给类的属性添加private访问修饰符,试试结果

      学习日报 1026 使用属性升级MyBank_赋值_05

      学习日报 1026 使用属性升级MyBank_访问修饰符_06

    • 定义一个类的方法,方法中使用private修饰的变量

      学习日报 1026 使用属性升级MyBank_封装_07

      学习日报 1026 使用属性升级MyBank_访问修饰符_08

      • 需求说明

        学习日报 1026 使用属性升级MyBank_访问修饰符_09

    • 结论?

      • private修饰的属性 是私有的,外部不可访问
      • 内部的方法是可以访问的
    • 提示

      • 如果类中定义属性不加访问修饰符,默认是internal的访问修饰符,功能后面章节再议
  • 演练,私有访问修饰符的应用

    • 需求:定义一个人,名字叫小丽

    • 给小丽赋值年龄,年龄赋值为200岁

    • 想一想,年龄给200岁是否合理?

    • 如何控制给对象赋值的准确性?

      • 不允许直接操做对象的属性值
    • 理解图例

      学习日报 1026 使用属性升级MyBank_字段_10

      • 限制年龄被直接操做
      • 提供一个公有方法,此方法可以操做私有的属性
      • 调用公有方法,提供相关的数据
    • 如果要赋值,需要经历一个验证

    • 写一个给年龄赋值的方法,setAge,接收一个年龄

      • 如果年龄超出人类范围,给年龄赋值-1代表非法操作
      • 如果年龄是正常的,那就使用正常的值
    • 写一个获取年龄的方法,getAge,输出年龄

    • 参考代码

      women

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;
      
      namespace ConsoleApplication5
      {
        class Womem
        {
         public string name;
         private int age;
      
         public void setAge(int n) { 
          
           // 年龄的合法性判断
           if (age < 0 || age > 100) {
             age = -1;
             return;
           }
             age=n;
         }
      
         public void getAge() {
           Console.WriteLine(age);
         }
      
        }
      }
      
      

      Program

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;
      
      namespace ConsoleApplication5
      {
        class Program
        {
          static void Main(string[] args)
          {
            Womem one = new Womem();
            one.name = "小丽";
            one.setAge(20);
            one.getAge();
             
            Console.WriteLine("ok");
            Console.ReadKey();
          }
        }
      }
      
      
    • 课堂代码

      学习日报 1026 使用属性升级MyBank_初始化_11

  • 小结

    • 为了防止其他人随意的操做对象的一些敏感属性

    • 对这些属性进行私有化

    • 提供公有方法让你改

      • 设置值的方法,一般都接收值

        • 方法中会验证你所传递的值
        • 如果合法,就使用
        • 如果不合法,就有一个默认值或其它提示
      • 获取值的方法

        • 直接输出私的有属性

this关键词

演练一,引入this关键词

  • 定义一个people,人的类

  • 具有属性name,有默认值“人类”

  • 定义一个起名字的方法setName,接收参数name

    • 打印参数name
    • 打印属性name
  • 看代码猜一猜结果

    方法中的name到底是什么属性

    学习日报 1026 使用属性升级MyBank_初始化_12

    方法的调用

    学习日报 1026 使用属性升级MyBank_字段_13

  • 答案

    学习日报 1026 使用属性升级MyBank_字段_14

  • 问题,如何输出值为“人类”的name值呢?

  • 试一试this关键词

    学习日报 1026 使用属性升级MyBank_初始化_15

演练二,写一个设置年龄的方法,形参不躲属性名

  • 说明

    • 之前的设置年龄的属性中,我们躲避了类属性名称
    • 本例中不用躲避,直接让形参起想起的名字
  • 演练

    • 定义一个Hero类,具有私有的age属性

    • 类中定义setAge方法,接收一个age属性

    • 如果年龄在1-100内就给对象赋值成功

    • 如果年龄不在这个范围内,就设置年龄为0岁

    • 代码

      学习日报 1026 使用属性升级MyBank_初始化_16

      学习日报 1026 使用属性升级MyBank_字段_17

小结

  • 公有方法中的局部变量age与this.age的区别
  • 公有方法中局部age,它在方法结束后就释放了
  • this.age,它是对象的一个属性,只要对象在还,this.age就一直存在
  • 我们通过this.age是可以绝对的访问到对象的age的

对象的读写属性

文件的读写属性

学习日报 1026 使用属性升级MyBank_访问修饰符_18

  • 演示 记事本的只读属性 1022

    演示 记事本的只读属性 1022 - 西瓜视频
    https://www.ixigua.com/6886445386551165448/?utm_source=xiguastudio

对象属性的读写属性

  • 换一种读法以示区分,对象字段的属性

演练 使用读写属性

类中字段的读写属性

学习日报 1026 使用属性升级MyBank_初始化_19

使用字段的属性

学习日报 1026 使用属性升级MyBank_初始化_20

分步操作

  • 写义一个标识符,用花括号包裹get与set控制器

  • 给get控制器写返回值

  • 在set控制器中存在value形参

    • 形参的值就是赋的值
    • 通过给字段赋值来改变对象的字段值

对象的初始化器

说明

  • 对象实例化时有时需要初始化数据
  • 使用初始化器可以一步到位的操作

格式

  • 类型 变量=new 类名(){字段1的读写属性=值1,字段2的读写属性=值2}

例子

  • Hero a = new Hero() {Age=16,Size=46 };

演练

  • 如果对象有了封装的属性,初始化时给封装属性名赋值

方法的封装

什么是封装?

  • 把相关的东西打包放在一起
  • 例子,两个数交换是由一组代码组成,我们可以把它们封装在一个方法中

封装演习

  • 手动封装方法

    手动封装方法 c# 2248 - 西瓜视频
    https://www.ixigua.com/6886456841027453447/?utm_source=xiguastudio

  • 自动封装方法

    • 视频

      • 子主题 1

传参方式

理解

  • 战略地图案例

    • 情况一,地图拷备
    • 情况二,地图移交
  • 表格文档案例

    • 情况一,博客记录表,文件发学生群里,学生填写
    • 情况二,表格共亨链接发学生群里,学生填写

值传递

  • 代码

    学习日报 1026 使用属性升级MyBank_访问修饰符_21
    学习日报 1026 使用属性升级MyBank_初始化_22

引用传递

  • 使用ref关键词

    • 形参前加
    • 实参前加
  • 代码

    学习日报 1026 使用属性升级MyBank_赋值_23
    学习日报 1026 使用属性升级MyBank_初始化_24