C#:is关键字

news2025/4/8 23:24:51

目录

is 关键字的核心是什么?

1. 什么是 is 关键字,为什么要用它?

2. 如何使用 is 关键字?

3. is 的作用和场景

4. is 与 as 的区别

5. 模式匹配的扩展(C# 8.0+)

6. 常见陷阱和注意事项

总结:is 关键字的核心思想

is 关键字的核心是什么?

从最基本的角度看,人类总是需要判断某个东西“是不是”某种类型。比如,你看到一个动物,想知道它“是不是”狗。你不会直接去摸它或测试它,而是通过观察特征(比如有四条腿、会汪汪叫)来判断。is 关键字在 C# 中就像这个“观察工具”,它用来检查一个对象是否属于某个类型,或者是否可以安全地转换为某个类型。

is 的核心思想是:安全地检查类型,而不引发异常。它帮助程序在运行时(runtime)判断对象的实际类型,并决定是否可以执行某些操作。

1. 什么是 is 关键字,为什么要用它?

定义:is 关键字是 C# 提供的一种运算符,用于检查一个对象是否与某个类型兼容。如果兼容,返回 true;否则返回 false。它不会改变对象本身,也不会抛出异常,是一种安全的方式来检查类型。

为什么要用 is 而不是直接转换?

 从第一性原理看:假设你有一个神秘的盒子(对象),你不确定里面是苹果还是橘子。如果你直接试着把它当作苹果(强制转换),但里面是橘子,可能会出错(抛出异常)。is 就像先用 X 光检查一下,确认里面“是不是”苹果,再决定下一步。

与直接转换的对比:

  • 直接强制转换(()):如果类型不匹配,会抛出 InvalidCastException,这不安全。

  • is 检查:先确认类型是否匹配,避免异常,确保代码更 robust(健壮)。

例子:假设你有一个对象列表,里面可能有不同类型的动物,你想知道某个动物“是不是”狗。 

object animal = new Dog(); // 假设 animal 是一个狗对象

if (animal is Dog) // 检查 animal 是否是 Dog 类型
{
    Console.WriteLine("这是只狗!");
    Dog dog = (Dog)animal; // 安全转换
}
else
{
    Console.WriteLine("这不是狗。");
}

这里,is 先检查 animal 是否是 Dog 类型,如果是,才安全地转换。如果不是,直接跳到 else 分支,避免异常。 

2. 如何使用 is 关键字?

is 的基本语法是:

if (expression is type)
{
    // 如果 expression 是 type 类型,执行这里的代码
}

常见用法:

类型检查:确认对象是否属于某个特定类型。

例子:

public class Animal { }
public class Dog : Animal { }
public class Cat : Animal { }

Animal myPet = new Dog();

if (myPet is Dog)
{
    Console.WriteLine("我的宠物是狗!");
}
else if (myPet is Cat)
{
    Console.WriteLine("我的宠物是猫!");
}
else
{
    Console.WriteLine("我不知道这是什么动物。");
}

与模式匹配结合(C# 7.0+):is 可以直接声明变量,简化代码。

例子:

object obj = "Hello";

if (obj is string text) // 如果 obj 是 string 类型,将其赋值给 text
{
    Console.WriteLine($"这是一个字符串:{text}");
}
else
{
    Console.WriteLine("这不是字符串。");
}

解释:这里 is string text 不仅检查类型,还将匹配的对象直接赋值给 text,省去了额外的强制转换。 

检查 null:is 也可以检查对象是否为 null。

例子:

object obj = null;

if (obj is null)
{
    Console.WriteLine("对象是 null!");
}
else
{
    Console.WriteLine("对象不是 null。");
}

3. is 的作用和场景

is 主要用于以下场景:

多态性检查:在继承或接口实现中,检查对象是否属于某个子类型或实现了某个接口。

例子(继承):

public interface ICanFly
{
    void Fly();
}

public class Bird : ICanFly
{
    public void Fly()
    {
        Console.WriteLine("鸟儿在飞!");
    }
}

object flyer = new Bird();

if (flyer is ICanFly flyingObject)
{
    flyingObject.Fly(); // 安全调用 Fly 方法
}

     类型安全转换:在不知道对象确切类型时,安全地决定是否转换。

     输入验证:检查方法参数或返回值的类型是否符合预期。

    4. is 与 as 的区别

    is 和 as 都是类型检查工具,但用途不同:

    • is:只检查类型,返回 true 或 false,不改变对象。

    • as:尝试转换类型,如果失败返回 null,不会抛异常。

    例子(对比):

    object obj = "Hello";
    
    if (obj is string) // 检查是否是字符串
    {
        string text = obj as string; // 安全转换
        Console.WriteLine(text); // 输出:Hello
    }
    else
    {
        Console.WriteLine("这不是字符串。");
    }

     注意:如果 obj 不是字符串,as 返回 null,而 is 只会返回 false。通常先用 is 检查,再用强制转换或 as 转换。

    5. 模式匹配的扩展(C# 8.0+)

    C# 现代版本增强了 is 的功能,支持更复杂的模式匹配,比如属性模式、类型模式等。

    例子(属性模式):

    public class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }
    
    object obj = new Person { Name = "Alice", Age = 25 };
    
    if (obj is Person p && p.Age > 18)
    {
        Console.WriteLine($"成年人:{p.Name}");
    }

    解释:这里不仅检查 obj 是否是 Person 类型,还检查其 Age 属性是否大于 18。这种写法更简洁,直接在 is 中完成类型检查和条件判断。 

    6. 常见陷阱和注意事项

    • 性能开销:频繁使用 is 检查会略微影响性能,因为它涉及运行时的类型检查。如果可以,在编译时确定类型(用静态类型),尽量避免过多的 is。

    • 不必要的检查:如果类型已经明确(比如变量已声明为特定类型),就不需要用 is。

    • 继承和接口:is 可以检查对象是否是某个基类或接口的实例,但不能检查私有类型或嵌套类型。

      例子(接口检查):

    if (myObject is IDisposable disposable) // 检查是否实现了 IDisposable
    {
        disposable.Dispose(); // 安全调用 Dispose
    }

    总结:is 关键字的核心思想

    用通俗的话说,is 就像一个“类型侦探”,它帮你安全地检查某个对象“是不是”你想要的类型。它的作用是防止错误(比如强制转换失败),并让代码更健壮。它尤其适合多态、继承或接口场景,让你灵活地处理不同类型的对象。

    在 C# 中,is 是类型检查的首选工具,特别在现代 C# 中结合模式匹配后,代码更加简洁和强大。

    本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2329544.html

    如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

    相关文章

    leetcode4.寻找两个正序数组中的中位数

    思路源于 LeetCode004-两个有序数组的中位数-最优算法代码讲解 基本思路是将两个数组看成一个数组,然后划分为两个部分,若为奇数左边部分个数多1,若为偶数左边部分等于右边部分个数。i表示数组1划分位置(i为4是索引4也表示i的左半…

    0101安装matplotlib_numpy_pandas-报错-python

    文章目录 1 前言2 报错报错1:ModuleNotFoundError: No module named distutils报错2:ERROR:root:code for hash blake2b was not found.报错3:**ModuleNotFoundError: No module named _tkinter**报错4:UserWarning: Glyph 39044 …

    OSCP - Proving Grounds- SoSimple

    主要知识点 wordpress 插件RCE漏洞sudo -l shell劫持 具体步骤 依旧是nmap 起手,只发现了22和80端口,但80端口只能看到一张图 Nmap scan report for 192.168.214.78 Host is up (0.46s latency). Not shown: 65533 closed tcp ports (reset) PORT …

    C语言求3到100之间的素数

    一、代码展示 二、运行结果 三、感悟思考 注意: 这个题思路他是一个试除法的一个思路 先进入一个for循环 遍历3到100之间的数字 第二个for循环则是 判断他不是素数 那么就直接退出 这里用break 是素数就打印出来 在第一个for循环内 第二个for循环外

    【2025】物联网发展趋势介绍

    目录 物联网四层架构感知识别层网络构建层管理服务层——**边缘存储**边缘计算关键技术:综合应用层——信息应用 物联网四层架构 综合应用层:信息应用 利用获取的信息和知识,支持各类应用系统的运转 管理服务层:信息处理 对数据进…

    如何查看 MySQL 的磁盘空间使用情况:从表级到数据库级的分析

    在日常数据库管理中,了解每张表和每个数据库占用了多少磁盘空间是非常关键的。这不仅有助于我们监控数据增长,还能为性能优化提供依据。 Google Gemini中国版调用Google Gemini API,中国大陆优化,完全免费!https://ge…

    汇编学习之《移位指令》

    这章节学习前需要回顾之前的标志寄存器的内容: 汇编学习之《标志寄存器》 算数移位指令 SAL (Shift Arithmetic Left)算数移位指令 : 左移一次,最低位用0补位,最高位放入EFL标志寄存器的CF位(进位标志) OllyDbg查看…

    Nature Communications上交、西湖大学、复旦大学研发面向机器人多模式运动的去电子化刚弹耦合高频自振荡驱动单元

    近年来,轻型仿生机器人因其卓越的运动灵活性与环境适应性受到国际机器人领域的广泛关注。然而,现有气动驱动器普遍受限于低模量粘弹性材料的回弹滞后效应与能量耗散特性,加之其"非刚即柔"的二元结构设计范式,难以同时满…

    对备忘录模式的理解

    对备忘录模式的理解 一、场景1、题目【[来源](https://kamacoder.com/problempage.php?pid1095)】1.1 题目描述1.2 输入描述1.3 输出描述1.4 输入示例1.5 输出示例 2、理解需求 二、不采用备忘录设计模式1、代码2、问题3、错误的备忘录模式 三、采用备忘录设计模式1、代码1.1 …

    【数据结构】图的基本概念

    图的定义 通俗来说一堆顶点被一堆线连在一起,这一坨顶点与线的集合 目录 图的定义 术语 有向图与无向图 简单图与多重图 度、入度与出度 路径与回路 路径长度与距离 子图 连通、连通图与连通分量 强连通、强连通图与强连通分量 完全图 生成树与生成森林 权…

    激光加工中平面倾斜度的矫正

    在激光加工中,加工平面的倾斜度矫正至关重要,直接影响加工精度和材料处理效果。以下是系统的矫正方法和步骤: 5. 验证与迭代 二次测量:加工后重新检测平面度,确认残余误差。 反馈优化:根据误差分布修正补偿…

    rdiff-backup备份

    目录 1. 服务器备份知识点 1.1 备份策略 1.2 备份步骤和宝塔面板简介 1.3 CentOS7重要目录 2. 备份工具 2.1 tar -g 备份演示 2. rsync 备份演示 3. rdiff-backup 备份演示 4. 差异和优缺点 3. rdiff-backup安装和使用 3.1 备份命令rdiff-backup 3.2 恢复命令--…

    PE结构(十五)系统调用与函数地址动态寻找

    双机调试 当需要分析一个程序时,这个程序一定是可以调试的,操作系统也不例外。在调试过程中下断点是很重要的 当我们对一个应用程序下断点时,应用程序是挂起的。但当我们对操作系统的内核程序下断点时,被挂起的不是内核程序而是…

    webrtc 本地运行的详细操作步骤 1

    前言 选修课的一个课程设计,需要我们本地运行这个开源项目,给我的压力非常大,因为确实不是很熟练这种操作。但是还是得做。谨以此文,纪念这个过程。 之前自己在 github 上面看到有代码仓库,但是比较复杂,在…

    kali——httrack

    目录 前言 使用教程 前言 HTTrack 是一款运行于 Kali Linux 系统中的开源网站镜像工具,它能将网站的页面、图片、链接等资源完整地下载到本地,构建出一个和原网站结构相似的离线副本。 使用教程 apt install httrack //安装httrack工具 httrac…

    【计算机网络】Linux配置SNAT/DNAT策略

    什么是NAT? NAT 全称是 Network Address Translation(网络地址转换),是一个用来在多个设备共享一个公网 IP上网的技术。 NAT 的核心作用:将一个网络中的私有 IP 地址,转换为公网 IP 地址,从而…

    AI安全:构建负责任且可靠的系统

    AI已成为日常生活中无处不在的助力,随着AI系统能力和普及性的扩展,安全因素变得愈发重要。从基础模型构建者到采用AI解决方案的企业,整个AI生命周期中的所有相关方都必须共同承担责任。 为什么AI安全至关重要? 对于企业而言&…

    VUE+SPRINGBOOT+语音技术实现智能语音歌曲管理系统

    语音控制歌曲的播放、暂停、增删改查 <template><div class"Music-container"><div style"margin: 10px 0"><!--检索部分--><el-input style"width: 200px;" placeholder"请输入歌曲名称"v-model"sen…

    使用 SignalR 在 .NET Core 8 最小 API 中构建实时通知

    示例代码&#xff1a;https://download.csdn.net/download/hefeng_aspnet/90448094 介绍 构建实时应用程序已成为现代 Web 开发中必不可少的部分&#xff0c;尤其是对于通知、聊天系统和实时更新等功能。SignalR 是 ASP.NET 的一个强大库&#xff0c;可实现服务器端代码和客户…

    复古未来主义屏幕辉光像素化显示器反乌托邦效果PS(PSD)设计模板样机 Analog Retro-Futuristic Monitor Effect

    这款模拟复古未来主义显示器效果直接取材于 90 年代赛博朋克电影中的黑客巢穴&#xff0c;将粗糙的屏幕辉光和像素化的魅力强势回归。它精准地模仿了老式阴极射线管显示器&#xff0c;能将任何图像变成故障频出的监控画面或高风险的指挥中心用户界面。和……在一起 2 个完全可编…