C#:is关键字
目录
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# 中结合模式匹配后,代码更加简洁和强大。
相关文章:
C#:is关键字
目录 is 关键字的核心是什么? 1. 什么是 is 关键字,为什么要用它? 2. 如何使用 is 关键字? 3. is 的作用和场景 4. is 与 as 的区别 5. 模式匹配的扩展(C# 8.0) 6. 常见陷阱和注意事项 总结&#x…...
SpringCloud第二篇:注册中心Eureka
注册中心的意义 注册中心 管理各种服务功能包括服务的注册、发现、熔断、负载、降级等,比如dubbo admin后台的各种功能。 有了注册中心,调用关系的变化,画几个简图来看一下。(了解源码可求求: 1791743380) 服务A调用服务B 有了注册中心之后&a…...
CSS语言的硬件驱动
CSS语言的硬件驱动探讨 引言 随着信息技术的迅猛发展,硬件和软件之间的交互愈发复杂,特别是在嵌入式系统、物联网设备等领域,硬件驱动程序的开发变得至关重要。而在众多编程语言中,CSS(层叠样式表)作为一…...
浅入浅出:从传统开发者角度去了解区块链和智能合约之间的关系
前言 在传统开发者视角:智能合约与区块链数据库探秘文中我为大家简单的讲解了DApp开发中智能合约开发和传统开发中数据存储层面的不同。而智能合约则是DApp中重要的组成部分,如同传统开发中的后端。 但是我们不要忘记的是:智能合约是应区块链而生的。 那么对于区块链来说…...
使用人工智能大模型DeepSeek,如何免费辅助教学?
今天我们学习DeepSeek工具如何辅助教学?DeepSeek功能很强大,带动人工智能快速发展,这里给DeepSeek点个赞。免费手把手学习视频地址:https://edu.csdn.net/learn/40402/666415 第一步,进入DeepSeek官网。打开google浏览器&#x…...
leetcode-代码随想录-链表-链表理论基础
链表: 通过指针串联在一起的线性结构;每个节点包含两部分:数据域、指针域(存放下一个节点的指针)入口节点:称为 头节点 head最后一个节点的指针指向 NULL(空指针) 链表的类型 1. 单…...
dify中配置使用Ktransformer模型
一共是两个框架一个是Ktransformer,一个是dify。 Ktransformer用来部署LLM,比如Deepseek,而LLm的应用框架平台Dify主要用来快速搭建基于LLM应用。 这篇教程主要是用来介绍两个框架的交互与对接的,不是部署Ktransformer也部署部署Dify,要部署Dify、Ktransformer可以直接参考…...
解释区块链技术的应用场景和优势
区块链技术是一种基于分布式账本的技术,被广泛应用于多个领域。以下是区块链技术的主要应用场景和优势: 应用场景: 金融领域:区块链可以用于支付结算、跨境汇款、智能合约等金融服务,提高交易效率和降低成本。物联网…...
明清两朝全方位对比
明清两朝是中国历史上最后两个封建王朝,在政治、经济、文化等方面存在显著差异,以下为主要区别: 一、政治制度 皇权集中程度 明朝:废除丞相制度,设内阁辅助皇帝,但中后期宦官专权(如刘瑾、魏…...
Mysql的事务
事务的概念 简单的说事务就是一个连贯性任务,只有一起成功或者一起失败的说法。在mysql的事务中要么事务里的sql语句成功执行,其中有出错就回滚到事务开始时候的状态。对于已经提交的事务来说,该事务对数据库所做的修改将永久生效事务的四大特性ACID 原子性(Atomicity):一件…...
chromium魔改——绕过无限debugger反调试
在进行以下操作之前,请确保已完成之前文章中提到的 源码拉取及编译 部分。 如果已顺利完成相关配置,即可继续执行后续操作。 在浏览器中实现“无限 debugger”的反调试技术是一种常见的手段,用于防止他人通过开发者工具对网页进行调试或逆向…...
【力扣hot100题】(051)腐烂的橘子
我讨厌图论。 这道题写了特别久,不过好歹也是写出来了…… 方法是先将橘子全部遍历一遍,做两件事:①找出所有连通的橘子②找出所有腐烂的橘子,设置一个vector<queue<int>>,每个vector元素代表一片连通的…...
PyTorch实现线性回归的基础写法与封装API写法
目录 1. 基础写法 1.1导包 2.2加载读取数据 2.3原始数据可视化(画图显示) 2.4线性回归的(基础)分解写法 2.5定义训练过程 2.PyTorch实现 线性回归的封装写法(实际项目中的常用写法) 2.1创建线性回归模型 2.2定义损失函数 2.3定义优化器 2.4定义训练过程 1…...
【蓝桥杯】算法笔记3
1. 最长上升子序列(LIS) 1.1. 题目 想象你有一排数字,比如:3, 1, 2, 1, 8, 5, 6 你要从中挑出一些数字,这些数字要满足两个条件: 你挑的数字的顺序要和原来序列中的顺序一致(不能打乱顺序) 你挑的数字要一个比一个大(严格递增) 问:最多能挑出多少个这样的数字? …...
【Linux】条件变量封装类及环形队列的实现
📢博客主页:https://blog.csdn.net/2301_779549673 📢博客仓库:https://gitee.com/JohnKingW/linux_test/tree/master/lesson 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! &…...
wsl2 配置ubuntu 固定ip
提示:环境搭建 文章目录 前言一、安装sshd 服务1. ubuntu 子系统安装 openssh-server2.配置sshd 开启密码链接3.配置sshd 服务开机启动 二、配置固定IP1 查看i2 查看路由3 查看wsl虚拟网卡4 配置wsl 子系统网卡4 设置生效 三、问题1. ssh 无法远程 前言 提示&#…...
电机控制学习路线
一、基础理论准备阶段 电路与电子技术 电路分析基础(基尔霍夫定律、动态电路分析) 模拟电子技术(放大器、滤波电路、功率器件) 数字电子技术(逻辑电路、微控制器基础) 数学工具 线性代数(矩…...
Sensodrive力控关节模组SensoJoint:TÜV安全认证助力机器人开发
在机器人技术领域,安全性和开发效率是行业关注的重点。SensoDrive的SensoJoint 机器人力控关节模组,凭借其可靠的安全性能和高效的开发优势,正在为机器人开发提供有力支持。 2025年3月31日,SensoDrive的 SensoJoint 力控关节模组获…...
【橘子大模型】Runnable和Chain以及串行和并行
一、Runnable 前面我们实现了一些关于如何和大模型进行交互的操作。那么我们此时来回顾一下我们当前进行的结构。 我们已经很清楚这些操作的具体含义了,所以我这里就不在多介绍了。我们来看其中的几个点 1、用户那边就是客户,没啥说的。 2、langchain&…...
数据结构 -- 图的存储
图的存储 邻接矩阵法 邻接矩阵存储不带权图 0 - 表示两个顶点不邻接 1 - 表示两个顶点邻接 在无向图中,每条边在矩阵中对应两个1 在有向图中,每条边在矩阵中对应一个1 //不带权图的邻接矩阵存储 #define MaxVertexNum 100 //顶点数目的最大值 typed…...
基于大模型预测不稳定性心绞痛的多维度研究与应用
目录 一、引言 1.1 研究背景与意义 1.2 研究目的 1.3 国内外研究现状 二、不稳定性心绞痛概述 2.1 定义与分类 2.2 发病机制 2.3 临床表现 三、大模型技术原理与应用基础 3.1 大模型介绍 3.2 在医疗领域的应用现状 3.3 用于不稳定性心绞痛预测的可行性 四、术前预…...
【Java集合】LinkedList源码深度分析
参考笔记:java LinkedList 源码分析(通俗易懂)_linkedlist源码分析-CSDN博客 目录 1.前言 2.LinkedList简介 3.LinkedList的底层实现 4.LinkedList 与 ArrayList 的对比 4.1 如何选择 4.2 对比图 5.LinkedList 源码Debug 5.1 add(E e) ÿ…...
Java 大视界 -- Java 大数据在智能供应链库存优化与成本控制中的应用策略(172)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
高并发系统架构设计核心要点的结构化提炼【大模型总结】
以下是对高并发系统架构设计核心要点的结构化提炼,结合技术深度与实践视角,以清晰的层次呈现关键策略与实现路径: 一、核心理念重塑 1. 容错优先思维 设计哲学:从"零故障"转向"可恢复性"设计,接…...
【C#深度学习之路】如何使用C#实现Stable Diffusion的文生图功能
【C#深度学习之路】如何使用C#实现Stable Diffusion的文生图功能 项目背景项目实现写在最后项目下载链接 本文为原创文章,若需要转载,请注明出处。 原文地址:https://blog.csdn.net/qq_30270773/article/details/147002073 项目对应的Github地…...
k8s的pod的概述和配置
概念 Pod 容器组 是一个k8s中一个抽象的概念,用于存放一组 container(可包含一个或多个 container 容器,即图上正方体),以及这些 container (容器)的一些共享资源。这些资源包括: 共享存储&…...
RTOS任务句柄的作用
任务句柄(Task Handle)在 FreeRTOS 中的作用详解 任务句柄(TaskHandle_t)是 FreeRTOS 中用于 唯一标识和管理任务 的核心机制,本质是一个指向任务控制块(TCB)的指针。说明即便创建的任务名相同,但对应的任务句柄一定是不同。 它在任务管理、通信、调试中起到关键作用,…...
OpenVLA-OFT——微调VLA的三大关键设计:并行解码、动作分块、连续动作表示以及L1回归目标
前言 25年3.26日,这是一个值得纪念的日子,这一天,我司「七月在线」的定位正式升级为了:具身智能的场景落地与定制开发商 ,后续则从定制开发 逐步过渡到 标准产品化 比如25年q2起,在定制开发之外࿰…...
LocaDate、LocalTime、LocalDateTime
Java8的时间处理 Java的时间处理在早期版本中存在诸多问题(如 java.util.Date 和 java.util.Calendar 的混乱设计),但Java8引入了引入了全新的 java.time包(基于JSR 310),提供了更清晰、线程安全且强大的时…...
哈密尔顿路径(Hamiltonian Path)及相关算法题目
哈密尔顿路径要求访问图中每个顶点恰好一次,通常用于解决旅行商问题(TSP)或状态压缩DP问题。 哈密尔顿路径(Hamiltonian Path)是指在一个图中经过每个顶点恰好一次的路径。如果这条路径的起点和终点相同(即…...
突破传统限制!全新端到端开放词汇多目标跟踪框架OVTR,开启视觉追踪新纪元
在自动驾驶和智能监控等场景中,多目标跟踪(MOT)技术需要应对现实世界中层出不穷的新物体类别。传统方法依赖预定义类别,面对“无人机配件”“新型宠物”等未知目标时往往失效。上海人工智能实验室团队提出的OVTR(Open-…...
Springboot + Vue + WebSocket + Notification实现消息推送功能
实现功能 基于Springboot与Vue架构,首先使用Websocket实现频道订阅,在实现点对点与群发功能后,在前端调用windows自带的消息通知,实现推送功能。 开发环境 Springboot 2.6.7vue 2.6.11socket-client 1.0.0 准备工作 在 Vue.js…...
Linux内核物理内存组织结构
一、系统调用sys_mmap 系统调用mmap用来创建内存映射,把创建内存映射主要的工作委托给do_mmap函数,内核源码文件处理:mm/mmap.c 二、系统调用sys_munmap 1、vma find_vma (mm, start); // 根据起始地址找到要删除的第一个虚拟内存区域 vma 2…...
Redis高级技能进阶
什么是事务的ACID 事务是由一系列对系统中数据进行访问或更新的操作组成的程序执行逻辑单元。这些操作要么都执行,要么都不执行。 为了保证数据库的一致性,在事务处理之前和之后,都应该遵循某些规则,也就是大家耳熟能详的ACID。 …...
PCB设计基础:面向嵌入式工程师的系统性指南
嵌入式系统的性能、稳定性和可靠性,很大程度上依赖于电路硬件的设计质量。在硬件设计中,PCB(Printed Circuit Board)设计是连接系统功能与实际运行的关键一环。本文将从嵌入式工程师的视角,系统性地介绍PCB设计的关键基…...
aspark 配置2
编写Hadoop集群启停脚本 1.建立新文件,编写脚本程序 在hadoop101中操作,在/root/bin下新建文件:myhadoop,输入如下内容: 2.分发执行权限 保存后退出,然后赋予脚本执行权限 [roothadoop101 ~]$ chmod x /r…...
【统计方法】LASSO筛变量
启 比较原始做LASSO包是library(glmnet) 若目标是纯 LASSO 分析,alpha 必须设为 1 标准化数据:LASSO 对特征的尺度敏感,需对数据进行标准化(均值为0,方差为1)。 cv.glmnet获得的lambda.m…...
拥抱健康生活,书写养生新篇
在快节奏的现代生活中,健康愈发成为人们关注的焦点。践行健康养生,并非是一种选择,而是我们对自己和家人应尽的责任。掌握正确的养生之道,不仅能提升生活品质,更能让生命焕发出新的活力。 合理饮食是健康的基石。一…...
Shiro学习(五):Shiro对权限的缓存
一、问题描述 由前边的学习中了解,用户的角色权限一般存储在数据库中,每次进行权限校验时都要从 数据库查询用户的角色权限信息;对数据库来说这样频繁的查询压力太大了,也影响程序的 性能。 Shiro 中执行权限角色校验时࿰…...
QGIS实战系列(六):进阶应用篇——Python 脚本自动化与三维可视化
欢迎来到“QGIS实战系列”的第六期!在前几期中,我们从基础操作到插件应用逐步提升了 QGIS 技能。这一篇,我们将迈入进阶领域,探索如何用 Python 脚本实现自动化,以及如何创建三维可视化效果,让你的 GIS 项目更高效、更立体。 第一步:Python 脚本自动化 QGIS 内置了 Py…...
redis-cpp-cpp如何使用lua脚本
1.前言 我今天要在项目中使用lua脚本,结果搞半天都没有弄明白这个函数怎么调用,而且也似乎很少有redis相关的博客介绍,ai也回答的不准确! 2.正文 今天用一个例子演示一下 下面是lua脚本 const std::string LuaScript R"…...
C# Winform 入门(6)之不同类之间的值传递
承接上一个教程,利用委托事件来进行值传递 声明变量 public static double plx, ply,plxx,plyy;声明委托、事件 //声明委托 //事件 public delegate void transferDistance(double dis); public static transferDistance doTransfer; 直接读取form1中的变量 publ…...
JWT 秘钥的作用机制
JWT 秘钥的作用并不是给前端使用的,而是用于后端服务器内部的一个重要安全机制。 JWT 秘钥的作用 签名与验证: 秘钥主要用于对 JWT(JSON Web Token)进行签名和验证后端使用这个秘钥对令牌进行签名,确保令牌的完整性…...
sun.misc.BASE64Encoder 和 sun.misc.BASE64Decoder包
1. 在将别人的项目导入eclipse之后,出现了"sun.misc.BASE64Encoder找不到jar"的错误,我解决的办法是:右键项目》属性》Java Build Path》jre System Library 》access rules 》resolution选择accessible,下面填上**点击确定即可࿰…...
Java面试黄金宝典34
1. 主键索引底层的实现原理 定义 主键索引是数据库中用于唯一标识表中每一行记录的索引,常见的底层实现是 B 树结构。B 树是一种平衡的多路搜索树,由内部节点和叶子节点组成。内部节点只存储索引键和指向下一层节点的指针,不存储实际数据&am…...
计算机系统---CPU
定义与功能 中央处理器(Central Processing Unit,CPU),是电子计算机的主要设备之一,是计算机的核心部件。CPU是计算机的运算核心和控制核心,负责执行计算机程序中的指令,进行算术运算、逻辑运算…...
AWS云安全基线:构建企业级安全防护体系的完整指南
1. 引言 随着越来越多的企业将其业务和数据迁移到云端,云安全已成为一个不容忽视的关键议题。AWS作为全球领先的云服务提供商,提供了丰富的安全工具和最佳实践。本文将深入探讨如何构建一个全面的AWS云安全基线,以确保您的企业在云环境中的安全性。 2. AWS共享责任模型 在深…...
(三十三)Dart 中使用 Pub 包管理系统与 HTTP 请求教程
Dart 中使用 Pub 包管理系统与 HTTP 请求教程 Pub 包管理系统简介 Pub 是 Dart 和 Flutter 的包管理系统,用于管理项目的依赖。通过 Pub,开发者可以轻松地添加、更新和管理第三方库。 使用 Pub 包管理系统 1. 找到需要的库 访问以下网址,…...
如何实现单例模式?
一、模式定义与核心价值 单例模式(Singleton Pattern)是一种创建型设计模式,保证一个类仅有一个实例,并提供全局访问点。其核心价值在于: 资源控制:避免重复创建消耗性资源(如数据库连…...