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

C#8.0中新语法“is {}“的介绍及使用

一、C#7.0及之前is的使用

is操作符检查表达式的结果是否与给定类型兼容,或者(从c# 7.0开始)根据模式测试表达式。有关类型测试is操作符的信息,请参阅类型测试和类型转换操作符文章的is操作符部分。

1、is 模式匹配

从C#7.0开始,isswitch语句支持模式匹配。该is关键字支持以下模式:

Type模式:它测试表达式是否可以转换为指定的类型,如果可以,则将其强制转换为该类型的变量。

(Constant)常量模式:用于测试表达式是否求值为指定的常量值。

var模式:匹配成功并且将表达式的值绑定到新的局部变量的匹配。

从C#7.1开始,expr可能具有由通用类型参数及其约束定义的编译时类型。
如果exprtrue并且isif语句一起使用,则varname仅在if语句内分配。varname的范围是从is表达式到包含if语句的块末尾。在其他任何位置使用varname会导致使用尚未分配的变量时产生编译时错误。

1) Type模式

使用类型模式执行模式匹配时,is测试表达式是否可以转换为指定的类型,如果可以,将其强制转换为该类型的变量。这是对is语句的直接扩展,可以实现简洁的类型评估和转换。is类型模式的一般形式是:

  expr is type varname

下面的示例使用is类型模式提供类型的IComparable.CompareTo(Object)方法的实现。

using System;public class Employee : IComparable
{public String Name { get; set; }public int Id { get; set; }public int CompareTo(Object o){if (o is Employee e){return Name.CompareTo(e.Name);}throw new ArgumentException("o is not an Employee object.");}
}

2) (Constant)常量模式

使用常量模式执行模式匹配时,is测试表达式是否等于指定的常量。在C#6和更早版本中,switch语句支持常量模式。从C#7.0开始,该is语句也支持它。其语法为:

expr is constant

以下示例将类型和常量模式组合在一起,以测试对象是否为Dice实例,如果是,则确定掷骰的值是否为6。

using System;
public class Dice
{Random rnd = new Random();public Dice(){}public int Roll(){return rnd.Next(1, 7); }
}
class Program
{static void Main(string[] args){var d1 = new Dice();ShowValue(d1);}private static void ShowValue(object o){const int HIGH_ROLL = 6;if (o is Dice d && d.Roll() is HIGH_ROLL)Console.WriteLine($"The value is {HIGH_ROLL}!");elseConsole.WriteLine($"The dice roll is not a {HIGH_ROLL}!");}
}
// The example displays output like the following:
//      The value is 6!

null可以使用 (Constant)常量进行检查。该语句null支持关键字is。其语法为:

expr is null

示例代码:

using System;
class Program
{static void Main(string[] args){object o = null;if (o is null){Console.WriteLine("o does not have a value");}else{Console.WriteLine($"o is {o}");}int? x = 10;if (x is null){Console.WriteLine("x does not have a value");}else{Console.WriteLine($"x is {x.Value}");}// 'null' check comparisonConsole.WriteLine($"'is' constant pattern 'null' check result : { o is null }");Console.WriteLine($"object.ReferenceEquals 'null' check result : { object.ReferenceEquals(o, null) }");Console.WriteLine($"Equality operator (==) 'null' check result : { o == null }");}// The example displays the following output:// o does not have a value// x is 10// 'is' constant pattern 'null' check result : True// object.ReferenceEquals 'null' check result : True// Equality operator (==) 'null' check result : True
}

3) var模式

与var模式匹配的模式总是成功。它的语法是:

expr is var varname

expr的值总是分配给一个名为varname的局部变量。varname是与expr的编译时类型相同的变量。

如果expr的计算结果为null,则is表达式生成true并将null赋值给varname。var模式是is为数不多的对空值产生true的用法之一。

你可以使用var模式在一个布尔表达式中创建一个临时变量,如下面的例子所示:

using System;
using System.Collections.Generic;
using System.Linq;
class Program
{static void Main(){int[] testSet = { 100271, 234335, 342439, 999683 };var primes = testSet.Where(n => Factor(n).ToList() is var factors&& factors.Count == 2&& factors.Contains(1)&& factors.Contains(n));foreach (int prime in primes){Console.WriteLine($"Found prime: {prime}");}}static IEnumerable<int> Factor(int number) {int max = (int)Math.Sqrt(number);for (int i = 1; i <= max; i++) {if (number % i == 0){yield return i;if (i != number / i) {yield return number / i;}}}}
}
// The example displays the following output:
//       Found prime: 100271
//       Found prime: 999683

二、C# 8.0中is的新语法

属性模式

匹配任何非"null"且属性设置为Length为2的对象,示例代码如下:

if (value is { Length: 2 })
{ 
}

实现验证的示例:

public async Task<IActionResult> Update(string id, ...) 
{if (ValidateId(id) is { } invalid)return invalid;...
}

上面的例子中,ValidateId()可以返回nullBadObjectRequestResult的一个实例。如果返回了前者,验证就成功了,并转移到更新主体的其余部分。如果返回的是后者,则is{}为真(也就是说,当然BadObjectRequestResult的实例是一个对象),验证失败。

如果使用一般写法做个判断,可能需要更多的代码,如下:

public async Task<IActionResult> Update(string id, ...) 
{var invalid = ValidateId(id);if (invalid != null)return invalid;...
}

相关文档:The `is` operator - Match an expression against a type or constant pattern - C# | Microsoft Learn

相关文章:

C#8.0中新语法“is {}“的介绍及使用

一&#xff64;C#7.0及之前is的使用 is操作符检查表达式的结果是否与给定类型兼容&#xff0c;或者(从c# 7.0开始)根据模式测试表达式。有关类型测试is操作符的信息&#xff0c;请参阅类型测试和类型转换操作符文章的is操作符部分。 1&#xff64;is 模式匹配 从C&#xff0…...

编译器设计01-入门概述

编译器作用概述 源代码 → 编译器 目标代码 源代码\xrightarrow{\ \ \ 编译器\ \ \ }目标代码 源代码 编译器 ​目标代码 编译阶段概述 编译处理包括两个阶段&#xff1a;前端处理和后端处理&#xff0c;中间过程生成语法树。 编译处理&#xff1a;源代码 → 语法树 …...

SpringBoot封装Elasticsearch搜索引擎实现全文检索

一、前言 注&#xff1a;本文实现了Java对Elasticseach的分页检索/不分页检索的封装 ES就不用过多介绍了&#xff0c;直接上代码&#xff1a; 二、实现步骤&#xff1a; 创建Store类&#xff08;与ES字段对应&#xff0c;用于接收ES数据&#xff09; import com.alibaba.f…...

(C)一些题4

1. 以下叙述中正确的是( )。 A.C程序中的注释只能出现在程序的开始位置和语句的后面 B.C程序书写格式严格&#xff0c;要求行内只能写一个语句 C,C程序书写格式自由&#xff0c;一个语句可以写在多行上 D.用C语言编写的程序只能放在一个程序文件中 2.设有如下程序段 char …...

ChatGPT初体验:注册、API Key获取与ChatAPI调用详解

自从2022年10月&#xff0c;ChatGPT诞生以后&#xff0c;实际上已经改变了很多&#xff01;其火爆程度简直超乎想象&#xff0c;一周的时间用户过百万&#xff0c;两个月的时间用户过亿。 目前ChatGPT4已经把2023年4月以前的人类的知识都学习到了&#xff0c;在软件工程里面&am…...

TCP/IP协议、三次握手、四次挥手

TCP/IP TCP/IP协议分层TCP头部三次握手TCP四次挥手常见问题1、什么是TCP网络分层2、TCP为什么是三次握手&#xff0c;不是两次或者四次&#xff1f;3、TCP为什么是四次挥手&#xff0c;为什么不能是三次挥手将第二次挥手和第三次挥手合并&#xff1f;4、四次挥手时为什么TIME_W…...

Android U 匹配不到APN,无法发起数据建立的问题分析

问题 打开数据开关后&#xff0c;没有data PDN请求发起&#xff0c;因此无法上网。 根据日志确定是没有找到合适的data profile&#xff0c;原因一般有&#xff1a; 1、APN 没有配置 2、APN 类型/网络能力不满足——APN type或bearer 3、APN 配置了但被disable了——APN p…...

如何打造“面向体验”的音视频能力——对话火山引擎王悦

编者按&#xff1a;随着全行业视频化的演进&#xff0c;我们置身于一个充满创新与变革的时代。在这个数字化的浪潮中&#xff0c;视频已经不再只是传递信息的媒介&#xff0c;更是重塑了我们的交互方式和体验感知。作为字节跳动的“能力溢出”&#xff0c;火山引擎正在飞速奔跑…...

什么是NoOps

过去几年&#xff0c;自动化一直在推动整个 IT 行业向前发展。通过自动化某些任务&#xff0c;开发团队可以提高其能力&#xff0c;而无需感受到雇用新团队成员的预算压力。自动化还保证了更高的效率&#xff0c;特别是在操作和维护方面。 传统的软件开发工作流程涉及开发团队…...

Unity - Graphic解析

Gpahic 的作用 Graphic 是 Unity最基础的图形基类。主要负责UGUI的显示部分。 由上图可以看你出我们经常使用的Image&#xff0c;Text&#xff0c;都是继承自Graphic。 Graphic的渲染流程 在Graphic的源码中有以下属性 [NonSerialized] private CanvasRenderer m_CanvasRend…...

哈希思想的应用

目录 1.位图 位图的实现 题目变形一 题目变形二 题目变形三 总结&#xff1a; 2.布隆过滤器 概念 布隆过滤器的实现 3.哈希切割的思想 1.位图 哈希表和位图是数据结构中常用的两种技术。哈希表是一种数据结构&#xff0c;通过哈希函数把数据和位置进行映射&#xff0c…...

React入门使用 (官方文档向 Part1)

文章目录 React组件:万物皆组件 JSX: 将标签引入 JavaScriptJSX 规则1. 只能返回一个根元素2. 标签必须闭合3. 使用驼峰式命名法给 ~~所有~~ 大部分属性命名&#xff01;高级提示&#xff1a;使用 JSX 转化器 在 JSX 中通过大括号使用 JavaScript使用引号传递字符串使用大括号&…...

87基于matlab的双卡尔曼滤波算法

基于matlab的双卡尔曼滤波算法。第一步使用了卡尔曼滤波算法&#xff0c;用电池电压来修正SOC&#xff0c;然后将修正后的SOC作为第二个卡尔曼滤波算法的输入&#xff0c;对安时积分法得到的SOC进行修正&#xff0c;最终得到双卡尔曼滤波算法SOC估计值。结合EKF算法和安时积分法…...

Jacobi迭代与SOR迭代求解希尔伯特矩阵

给出线性方程组 Hn*x b&#xff0c;其中系数矩阵Hn为希尔伯特矩阵&#xff1a; 假设 x ∗ (1, 1, . . . , 1)T&#xff0c;b Hnx ∗。若取 n 6,8, 10&#xff0c;分别用 Jacobi 迭代法及 SOR迭代&#xff08;ω 1, 1:25,1:5&#xff09;求解&#xff0c;比较计算结果。…...

【云备份】配置加载文件模块

文章目录 配置信息设计配置文件加载cloud.conf配置文件单例模式的使用ReadConfigFile —— 读取配置文件GetInstance —— 创建对象其他函数的实现 具体实现cloud.confconfig.hpp 配置信息设计 使用文件配置加载一些程序运行的关键信息 可以让程序的运行更加灵活 配置信息&am…...

sqlserver写入中文乱码问题

sqlserver写入中文乱码问题解决方案 首先查看sqlserver数据库编码 首先查看sqlserver数据库编码 查询语句&#xff1a;SELECT COLLATIONPROPERTY(Chinese_PRC_Stroke_CI_AI_KS_WS, CodePage)&#xff1b; 对应的编码&#xff1a; 936 简体中文GBK 950 繁体中文BIG5 437 美国/加…...

【亚马逊云】基于EC2以 All-in-One 模式快速部署 KubeSphere 和 Kubernetes

文章目录 1. 云实例配置说明2. SSH连接云实例3. 查看系统版本4. 修改主机名5. 安装依赖项6. 安全组和DNS修改7. 下载KubeKey8. 同时安装Kubesphere和Kubernetes[可选]单独安装Kubernetes[可选]单独安装KubeSphere9. 验证KubeSphere安装结果10. 登录KubeSphere控制台[可选]安装K…...

使用 ChatGPT 创建 Makefile 构建系统:从 Docker 开始

使用 Docker 搭配 ChatGPT 创建 Makefile 构建系统 Makefile 构建系统是嵌入式软件团队实现其开发流程现代化的基础。构建系统不仅允许开发人员选择各种构建目标&#xff0c;还可以将这些构建集成到持续集成/持续部署 (CI/CD) 流程中。使用诸如 ChatGPT 这样的人工智能 (AI) 工…...

嵌入式设备摄像头基础知识

工作原理 摄像头的工作原理是&#xff0c;当光线通过镜头聚焦到图像传感器上时&#xff0c;传感器会将光信号转换为电信号&#xff0c;并将其传输给处理器进行处理。处理器通过算法对图像信号进行增强、去噪、压缩等操作&#xff0c;并将其转换为数字信号输出给计算机或其他设…...

使用Pytorch从零开始构建Normalizing Flow

归一化流 (Normalizing Flow) &#xff08;Rezende & Mohamed&#xff0c;2015&#xff09;学习可逆映射 f : X → Z f: X \rightarrow Z f:X→Z, 在这里X是我们的数据分布&#xff0c;Z是选定的潜在分布。 归一化流是生成模型家族的一部分&#xff0c;其中包括变分自动编…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

Golang——9、反射和文件操作

反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一&#xff1a;使用Read()读取文件2.3、方式二&#xff1a;bufio读取文件2.4、方式三&#xff1a;os.ReadFile读取2.5、写…...

[论文阅读]TrustRAG: Enhancing Robustness and Trustworthiness in RAG

TrustRAG: Enhancing Robustness and Trustworthiness in RAG [2501.00879] TrustRAG: Enhancing Robustness and Trustworthiness in Retrieval-Augmented Generation 代码&#xff1a;HuichiZhou/TrustRAG: Code for "TrustRAG: Enhancing Robustness and Trustworthin…...

用 FFmpeg 实现 RTMP 推流直播

RTMP&#xff08;Real-Time Messaging Protocol&#xff09; 是直播行业中常用的传输协议。 一般来说&#xff0c;直播服务商会给你&#xff1a; ✅ 一个 RTMP 推流地址&#xff08;你推视频上去&#xff09; ✅ 一个 HLS 或 FLV 拉流地址&#xff08;观众观看用&#xff09;…...

PLC入门【4】基本指令2(SET RST)

04 基本指令2 PLC编程第四课基本指令(2) 1、运用上接课所学的基本指令完成个简单的实例编程。 2、学习SET--置位指令 3、RST--复位指令 打开软件(FX-TRN-BEG-C)&#xff0c;从 文件 - 主画面&#xff0c;“B: 让我们学习基本的”- “B-3.控制优先程序”。 点击“梯形图编辑”…...

架构设计技巧——架构设计模板

一份实用、高效、覆盖核心要素的架构设计模板是确保设计质量、促进团队沟通和指导实施的关键。以下是一个经过提炼的架构设计文档核心模板框架&#xff0c;结合了业界最佳实践&#xff0c;并强调灵活裁剪&#xff1a; 架构设计文档模板 (核心框架) 文档标识 项目/系统名称&a…...