当前位置: 首页 > news >正文

【C#补全计划:类和对象(六)】

一、is关键字

1. 概念:判断一个对象是否为指定类的对象

2. 返回值:布尔值。对象是指定类型的对象为true,不是为false

3. 使用:

语法:对象 is 类名

using System;namespace IsAsAndObject
{class Program{static void Main(string[] args){// is关键字的使用Ragdoll ragdoll = new Ragdoll();bool isCat = ragdoll is Animal; // 使用is关键字检查ragdoll是否是Cat类型bool isDog = ragdoll is Dog; // 检查ragdoll是否是Dog类型Console.WriteLine("ragdoll是猫:" + isCat); // 输出:TrueConsole.WriteLine("ragdoll是狗:" + isDog); // 输出:False}}class Animal{public string Name { get; set; }public void animalSpeak(){Console.WriteLine("Animal speaks");}}class Cat : Animal{public void catSpeak(){Console.WriteLine("Cat meows");}}class Dog : Animal{public void dogSpeak(){Console.WriteLine("Dog barks");}}class Ragdoll : Cat{public void ragdollSpeak(){Console.WriteLine("Ragdoll purrs");}}
}

运行结果如下:

二、as关键字

1. 概念:将一个对象转换为指定类的对象

2. 返回值:指定类型的对象。对象转换成功返回指定类型对象,失败返回null

3. 使用:

语法:对象 as 类名

using System;namespace IsAsAndObject
{class Program{static void Main(string[] args){// is关键字的使用Ragdoll ragdoll = new Ragdoll();bool isCat = ragdoll is Animal; // 使用is关键字检查ragdoll是否是Cat类型bool isDog = ragdoll is Dog; // 检查ragdoll是否是Dog类型Console.WriteLine("ragdoll是猫:" + isCat); // 输出:TrueConsole.WriteLine("ragdoll是狗:" + isDog); // 输出:False// as关键字的使用Animal dog = new Dog(); // 创建了一个Dog类实例,但将其引用赋给Animal类型的变量。编译时是Animal类型,运行时是Dog类型// dog.dogSpeak() // 编译错误:Animal类没有dogSpeak方法(dog as Dog).dogSpeak(); // 使用as关键字进行类型转换,调用Dog类的方法,编译成功}}class Animal{public string Name { get; set; }public void animalSpeak(){Console.WriteLine("Animal speaks");}}class Cat : Animal{public void catSpeak(){Console.WriteLine("Cat meows");}}class Dog : Animal{public void dogSpeak(){Console.WriteLine("Dog barks");}}class Ragdoll : Cat{public void ragdollSpeak(){Console.WriteLine("Ragdoll purrs");}}
}

运行结果如下:

三、里氏替换原则

        里氏替换原则是面向对象七大原则中最重要的原则

1. 概念:任何父类出现的地方,子类都可以替代

2. 要求:

  • 子类必须完全实现父类约定

  • 子类不能破坏父类的行为

  • 子类可以扩展但不能修改核心行为

3. 语法表现:父类容器装载子类对象,因为子类对象包含了父类中的所有内容

4. 作用:方便进行对象存储和管理

5. 示例:

using System;namespace IsAsAndObject
{class Program{static void Main(string[] args){// is关键字的使用Ragdoll ragdoll = new Ragdoll();bool isCat = ragdoll is Animal; // 使用is关键字检查ragdoll是否是Cat类型bool isDog = ragdoll is Dog; // 检查ragdoll是否是Dog类型Console.WriteLine("ragdoll是猫:" + isCat); // 输出:TrueConsole.WriteLine("ragdoll是狗:" + isDog); // 输出:False// as关键字的使用Animal dog = new Dog(); // 创建了一个Dog类实例,但将其引用赋给Animal类型的变量。编译时是Animal类型,运行时是Dog类型// dog.dogSpeak() // 编译错误:Animal类没有dogSpeak方法(dog as Dog).dogSpeak(); // 使用as关键字进行类型转换,调用Dog类的方法,编译成功// 里氏替换原则示例:Console.WriteLine("里氏替换原则示例:");Animal[] animals = new Animal[] { new Animal("小云"), new Cat("小灰"), new Dog("小黑"), new Ragdoll("小白") };foreach(Animal a in animals) {Console.WriteLine(a.Name + ":");a.animalSpeak(); // 调用Animal类的方法,所有子类都可以调用if (a is Cat) { // 使用is关键字检查是否是Cat类型if(a is Ragdoll r) { // 进一步检查是否是Ragdoll类型r.ragdollSpeak(); // 调用Ragdoll类的方法continue;}(a as Cat).catSpeak(); // 调用Cat类的方法} else if (a is Dog) {// 使用is关键字检查是否是Dog类型(a as Dog).dogSpeak(); // 调用Dog类的方法}}}}class Animal{public string Name { get; set; }public Animal() {}public Animal(string name){Name = name;}public void animalSpeak(){Console.WriteLine("Animal speaks");}}class Cat : Animal{public Cat() {}public Cat(string name) : base(name) {}public void catSpeak(){Console.WriteLine("Cat meows");}}class Dog : Animal{public Dog() {}public Dog(string name) : base(name) {}public void dogSpeak(){Console.WriteLine("Dog barks");}}class Ragdoll : Cat{public Ragdoll() {}public Ragdoll(string name) : base(name) {}public void ragdollSpeak(){Console.WriteLine("Ragdoll purrs");}}
}

运行结果如下:

四、万类之父:Object 

1. 关键字:object

2. 概念:object是所有类的基类,他是一个类(引用类型)

3. 作用:

        (1)可以利用里氏替换原则,用object容器装所有对象

        (2)可以用来表示不确定的类型,作为函数参数中的类型

4. 使用:

using System;namespace IsAsAndObject
{class Program{static void Main(string[] args){// is关键字的使用Ragdoll ragdoll = new Ragdoll();bool isCat = ragdoll is Animal; // 使用is关键字检查ragdoll是否是Cat类型bool isDog = ragdoll is Dog; // 检查ragdoll是否是Dog类型Console.WriteLine("ragdoll是猫:" + isCat); // 输出:TrueConsole.WriteLine("ragdoll是狗:" + isDog); // 输出:False// as关键字的使用Animal dog = new Dog(); // 创建了一个Dog类实例,但将其引用赋给Animal类型的变量。编译时是Animal类型,运行时是Dog类型// dog.dogSpeak() // 编译错误:Animal类没有dogSpeak方法(dog as Dog).dogSpeak(); // 使用as关键字进行类型转换,调用Dog类的方法,编译成功// 里氏替换原则示例:Console.WriteLine("里氏替换原则示例:");Animal[] animals = new Animal[] { new Animal("小云"), new Cat("小灰"), new Dog("小黑"), new Ragdoll("小白") };foreach(Animal a in animals) {Console.WriteLine(a.Name + ":");a.animalSpeak(); // 调用Animal类的方法,所有子类都可以调用if (a is Cat) { // 使用is关键字检查是否是Cat类型if(a is Ragdoll r) { // 进一步检查是否是Ragdoll类型r.ragdollSpeak(); // 调用Ragdoll类的方法continue;}(a as Cat).catSpeak(); // 调用Cat类的方法} else if (a is Dog) {// 使用is关键字检查是否是Dog类型(a as Dog).dogSpeak(); // 调用Dog类的方法}}// 万类之父:Object的使用// 引用类型object obj1 = new Ragdoll("大白"); if(obj1 is Ragdoll) (obj1 as Ragdoll).ragdollSpeak();// 使用as关键字转换时,如果转换失败,结果为null// 值类型object obj2 = 100;int i = (int)obj2; // 强制类型转换:将object类型转换为int类型// 注意:如果obj2不是int类型,这里会抛出InvalidCastException异常// 数组类型object obj3 = new int[10];int[] arr1 = obj3 as int[]; // 使用as关键字进行类型转换int[] arr2 = (int[])obj3; // 强制类型转换// string类型object obj4 = "Hello, World!";string str1 = obj4 as string; // 使用as关键字进行类型转换string str2 = (string)obj4; // 强制类型转换string str3 = obj4.ToString(); // 调用ToString方法转换string str4 = obj4 + ""; // 使用字符串拼接转换}}class Animal{public string Name { get; set; }public Animal() {}public Animal(string name){Name = name;}public void animalSpeak(){Console.WriteLine("Animal speaks");}}class Cat : Animal{public Cat() {}public Cat(string name) : base(name) {}public void catSpeak(){Console.WriteLine("Cat meows");}}class Dog : Animal{public Dog() {}public Dog(string name) : base(name) {}public void dogSpeak(){Console.WriteLine("Dog barks");}}class Ragdoll : Cat{public Ragdoll() {}public Ragdoll(string name) : base(name) {}public void ragdollSpeak(){Console.WriteLine("Ragdoll purrs");}}
}

五、装箱和拆箱

1. 概念:

        (1)用object存储值类型(装箱)

        (2)将object转换为值类型(拆箱)

2. 装箱:

        (1)把值类型的变量用引用类型存储

        (2)栈内存会迁移到堆内存中

3. 拆箱

        (1)把引用类型存储的值类型取出来

        (2)堆内存会迁移到栈内存中

4. 优点:不确定类型时可以方便参数的存储和传递

5. 缺点:存在内存迁移,增加性能消耗

using System;namespace IsAsAndObject
{class Program{static void Main(string[] args){// is关键字的使用Ragdoll ragdoll = new Ragdoll();bool isCat = ragdoll is Animal; // 使用is关键字检查ragdoll是否是Cat类型bool isDog = ragdoll is Dog; // 检查ragdoll是否是Dog类型Console.WriteLine("ragdoll是猫:" + isCat); // 输出:TrueConsole.WriteLine("ragdoll是狗:" + isDog); // 输出:False// as关键字的使用Animal dog = new Dog(); // 创建了一个Dog类实例,但将其引用赋给Animal类型的变量。编译时是Animal类型,运行时是Dog类型// dog.dogSpeak() // 编译错误:Animal类没有dogSpeak方法(dog as Dog).dogSpeak(); // 使用as关键字进行类型转换,调用Dog类的方法,编译成功// 里氏替换原则示例:Console.WriteLine("里氏替换原则示例:");Animal[] animals = new Animal[] { new Animal("小云"), new Cat("小灰"), new Dog("小黑"), new Ragdoll("小白") };foreach(Animal a in animals) {Console.WriteLine(a.Name + ":");a.animalSpeak(); // 调用Animal类的方法,所有子类都可以调用if (a is Cat) { // 使用is关键字检查是否是Cat类型if(a is Ragdoll r) { // 进一步检查是否是Ragdoll类型r.ragdollSpeak(); // 调用Ragdoll类的方法continue;}(a as Cat).catSpeak(); // 调用Cat类的方法} else if (a is Dog) {// 使用is关键字检查是否是Dog类型(a as Dog).dogSpeak(); // 调用Dog类的方法}}// 万类之父:Object的使用// 引用类型object obj1 = new Ragdoll("大白"); if(obj1 is Ragdoll) (obj1 as Ragdoll).ragdollSpeak();// 使用as关键字转换时,如果转换失败,结果为null// 值类型object obj2 = 100;int i = (int)obj2; // 强制类型转换:将object类型转换为int类型// 注意:如果obj2不是int类型,这里会抛出InvalidCastException异常// 数组类型object obj3 = new int[10];int[] arr1 = obj3 as int[]; // 使用as关键字进行类型转换int[] arr2 = (int[])obj3; // 强制类型转换// string类型object obj4 = "Hello, World!";string str1 = obj4 as string; // 使用as关键字进行类型转换string str2 = (string)obj4; // 强制类型转换string str3 = obj4.ToString(); // 调用ToString方法转换string str4 = obj4 + ""; // 使用字符串拼接转换// 装箱和拆箱Console.WriteLine("装箱和拆箱示例:");Console.WriteLine("sum = " + Sum(1, 2.0, 3.0f, "4", new Dog())); // 装箱操作:将不确定类型的值转换为object类型}static float Sum(params object[] objects){float sum = 0;foreach (object o in objects) // 拆箱操作:将object类型的值转换为具体类型{if(o is int) sum += (int)o;if(o is float) sum += (float)o;if(o is double) sum += (float)(double)o;if(o is string) sum += float.TryParse((string)o, out float result) ? result : 0f;if(o is Animal) continue;}return sum;}}class Animal{public string Name { get; set; }public Animal() {}public Animal(string name){Name = name;}public void animalSpeak(){Console.WriteLine("Animal speaks");}}class Cat : Animal{public Cat() {}public Cat(string name) : base(name) {}public void catSpeak(){Console.WriteLine("Cat meows");}}class Dog : Animal{public Dog() {}public Dog(string name) : base(name) {}public void dogSpeak(){Console.WriteLine("Dog barks");}}class Ragdoll : Cat{public Ragdoll() {}public Ragdoll(string name) : base(name) {}public void ragdollSpeak(){Console.WriteLine("Ragdoll purrs");}}
}

运行结果如下:

        今天的学习就到这里了。感谢阅读。

        再见!

http://www.lryc.cn/news/598413.html

相关文章:

  • 【Linux基础知识系列】第六十三篇 - 文件编辑器基础:vim
  • Windows11 本地安装docker Desktop 部署dify 拉取镜像报错
  • 告别下载中断:深入解析Tomcat JSP中的“远程主机强迫关闭连接”与“软件中止连接”
  • BI 系统数据看板全解析:让数据可视化驱动业务决策
  • k8s之ingress定义https访问方式
  • 使用Claude Code从零到一打造一个现代化的GitHub Star项目管理器
  • QT项目-仿QQ音乐的音乐播放器(第二节)
  • 【初识数据结构】CS61B 中的归并排序和选择排序
  • [网安工具] 自动化威胁检测工具 —— D 盾 · 使用手册
  • kubernetes集群中部署CoreDNS服务
  • OceanBase 4.3.5 解析:DDL性能诊断
  • 爆肝整理,性能测试详细汇总,从0到1打通(二)
  • 基于深度学习的胸部 X 光图像肺炎分类系统(三)
  • 在 OceanBase 中,使用 TO_CHAR 函数 直接转换日期格式,简洁高效的解决方案
  • 深入理解 eMMC RPMB 与 OP-TEE 在 Linux 系统中的应用开发
  • 使用宝塔面板搭建 PHP 环境开发一个简单的 PHP 例子
  • 解决VSCode无法加载Json架构问题
  • 《计算机网络》实验报告八 加密、数字签名与证书
  • 力扣844. 比较含退格的字符串
  • 借助Aspose.HTML控件,在 Python 中将 HTML 转换为 Markdown
  • 【bug解决】 esp32 在WSL-ubuntu20.04环境下找不到设备
  • MIT线性代数01_方程组的几何解释
  • 造成服务器内存不足的原因有什么
  • 飞腾D2000/E2000/D3000如何从头制作UBOOT引导系统镜像
  • Pycharm、Python安装及配置小白教程
  • 【docker | 部署 】Jetson Orin与AMD平台容器化部署概述
  • 用LangChain重构客服系统:腾讯云向量数据库+GPT-4o实战
  • 使用爬虫获取游戏的iframe地址
  • DRF - 博客列表API
  • Django Models详解:数据库模型的核心