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

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

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

相关文章

推荐一个静态页面生成网站,可以快速生成一个文档页面

vitepress VitePress | Vite & Vue Powered Static Site Generator

智慧城市运营管理平台解决方案:PPT全文61页,附下载

关键词&#xff1a;智慧城市建设方案&#xff0c;智慧城市解决方案&#xff0c;智慧城市的发展前景和趋势&#xff0c;智慧城市建设内容&#xff0c;智慧城市运营管理平台 一、智慧城市运营平台建设背景 随着城市化进程的加速&#xff0c;城市面临着诸多挑战&#xff0c;如环…

概率论与数理统计中常见的随机变量分布律、数学期望、方差及其介绍

1 离散型随机变量 1.1 0-1分布 设随机变量X的所有可能取值为0与1两个值&#xff0c;其分布律为 若分布律如上所示&#xff0c;则称X服从以P为参数的(0-1)分布或两点分布。记作X~ B(1&#xff0c;p) 0-1分布的分布律利用表格法表示为: X01P1-PP 0-1分布的数学期望E(X) 0 *…

人工智能基础部分22-几种卷积神经网络结构的介绍,并用pytorch框架搭建模型

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能基础部分22-几种卷积神经网络结构的介绍&#xff0c;本篇文章我将给大家详细介绍VGG16、VGG19、ResNet、SENet、MobileNet这几个卷积神经网络结构&#xff0c;以及pytorch搭建代码&#xff0c;利用通用数据…

网站监控有什么用,什么是网站监控?

网站内容监控是指采用数据采集、人工智能、云计算、机器学习、语义分析等技术&#xff0c;结合网站内容监管指标&#xff0c;针对网站内容安全、信息发布、办事服务、互动交流、功能设计、创新发展等指标进行实时监测&#xff0c;以防止网站页面内容被篡改&#xff0c;出现黄、…

深度学习之九(Transformers)

Transformers 是一种用于处理序列数据的深度学习模型,特别擅长于自然语言处理(NLP)任务。Transformer 是一种基于自注意力机制(Self-Attention Mechanism)的架构,于2017年由 Vaswani 等人在 “Attention is All You Need” 论文中提出,它在机器翻译任务中取得了显著的性…

5G智慧工地整体解决方案:文件全文115页,附下载

关键词&#xff1a;5G智慧工地&#xff0c;智慧工地建设方案&#xff0c;智慧工地管理平台系统&#xff0c;智慧工地建设调研报告&#xff0c;智慧工地云平台建设 一、5G智慧工地建设背景 5G智慧工地是利用5G技术、物联网、大数据、云计算、AI等信息技术&#xff0c;围绕“人…

使用git下载远程所有分支到本地

使用git下载远程所有分支到本地&#xff1a; 打开gitbash 输入以下命令即可&#xff1a; git clone git地址 cd git文件夹 git branch -r | grep -v \-> | while read remote; do git branch --track "${remote#origin/}" "$remote"; done git fetch -…

Django JSONField/HStoreField SQL注入漏洞(CVE-2019-14234)

漏洞描述 Django 于2019年8月1日 日发布了安全更新&#xff0c;修复了 JSONField 和 HStoreField 两个模型字段的 SQL 注入漏洞。 参考链接&#xff1a; Django security releases issued: 2.2.4, 2.1.11 and 1.11.23 | Weblog | DjangoDjango JSONField SQL注入漏洞&#x…

java计算下一个整10分钟时间点

最近工作上遇到需要固定在整10分钟一个周期调度某个任务&#xff0c;所以需要这样一个功能&#xff0c;记录下 package org.example;import com.google.gson.Gson; import org.apache.commons.lang3.time.DateUtils;import java.io.InputStream; import java.util.Calendar; i…

1. git入门操作

1. git入门操作 1、基本名词解释 图片 名词含义index索引区&#xff0c;暂存区master分支名&#xff0c;每个仓库都有个master&#xff0c;它作为主分支。branch其他分支&#xff0c;我们可以把master分支上的代码拷贝一份&#xff0c;重新命名为其他分支名work space就是我…

Vue 2.0源码分析-渲染函数render

Vue 的 _render 方法是实例的一个私有方法&#xff0c;它用来把实例渲染成一个虚拟 Node。它的定义在 src/core/instance/render.js 文件中&#xff1a; Vue.prototype._render function (): VNode {const vm: Component thisconst { render, _parentVnode } vm.$options//…

雅可比矩阵(Jacobian Matrix)

假设给定一个从n维欧式空间到m维欧式空间的变换: 雅可比矩阵就是将一阶偏导数排列成一个m行、n列形式的矩阵&#xff0c;记作&#xff1a; 举一个例子&#xff1a; 雅可比矩阵等于&#xff1a;

迈巴赫S480升级主动式氛围灯 浪漫婉转的气氛

主动式氛围灯有263个可多色渐变的LED光源&#xff0c;营造出全情沉浸的动态光影氛围。结合智能驾驶辅助系统&#xff0c;可在转向或检测到危险时&#xff0c;予以红色环境光提示&#xff0c;令光影艺术彰显智能魅力。配件有6个氛围灯&#xff0c;1个电脑模块。 1、气候&#xf…

计算机思考与整理

应用程序 虚拟机 windows,linux等操作系统&#xff08;向上层应用程序提供接口&#xff09; x86架构&#xff0c;MIPS&#xff0c;ARM(提供指令集) 硬件组件 硬件组件&#xff08;hardware components&#xff09;是指构成计算机或电子设备的实体部分&#xff0c;它们包括各…

c++_继承

&#x1f3f7;如被何实现一个不能被继承的类&#xff08;或是继承无意义的类&#xff09; 将构造函数定义成私有的就行了&#xff0c;即&#xff1a;私有化父类的构造函数 c 11 新增关键字final 修饰父类直接不能被继承 class A final {........ }&#x1f3f7;继承与有元 有…

【Python进阶笔记】md文档笔记第6篇:Python进程和多线程使用(图文和代码)

本文从14大模块展示了python高级用的应用。分别有Linux命令&#xff0c;多任务编程、网络编程、Http协议和静态Web编程、htmlcss、JavaScript、jQuery、MySql数据库的各种用法、python的闭包和装饰器、mini-web框架、正则表达式等相关文章的详细讲述。 全套md格式笔记和代码自…

还不会配置Nginx?刷完这篇就够了

Nginx是一个开源的高性能HTTP和反向代理服务器。它可以用于处理静态资源、负载均衡、反向代理和缓存等任务。Nginx被广泛用于构建高可用性、高性能的Web应用程序和网站。它具有低内存消耗、高并发能力和良好的稳定性&#xff0c;因此在互联网领域非常受欢迎。 为什么使用Nginx…

【vue_2】创建一个弹出权限不足的提示框

定义了一个名为 getUserRole 的 JavaScript 函数&#xff0c;该函数接受一个参数 authorityId&#xff0c;根据这个参数的不同值返回相应的用户角色字符串。这段代码的目的是根据传入的 authorityId 值判断用户的角色&#xff0c;然后返回相应的角色名称。 如果 authorityId 的…

【源码】智慧工地系统:让工地管理可视化、数字化、智能化

智慧工地是指运用信息化手段&#xff0c;围绕施工过程管理&#xff0c;建立互联协同、智能生产、科学管理的施工项目信息化生态圈&#xff0c;并将此数据在虚拟现实环境下与物联网采集到的工程信息进行数据挖掘分析&#xff0c;提供过程趋势预测及专家预案&#xff0c;实现工程…