C#中的弃元

news/2024/5/1 10:00:27/文章来源:https://www.cnblogs.com/shanfeng1000/p/15005538.html

  从C#7.0开始,推出了一种新的特性:弃元,这种思想可能来源于Golang。

  弃元,就是不想要了的元素变量,用单下划线(_)表示,弃元在编译时起作用,就是搞编译器:这个变量我不要,你可以优化处理。

  我们经常在下面几个过程中使用弃元:

  1、元组解构赋值

  在使用元组解构赋值时,我们往往需要接收元组的所有项,而当我们是需要元组中的某些指定项时,就可以使用弃元了:  

    static (int, char, bool, string, object) GetTuple(){return (1, 'a', true, "hello", new object());}static void Main(string[] args){var (i, c, b, s, obj) = GetTuple();//接收所有项//接收部分项var (i, _, _, _, _) = GetTuple();(_, _, _, _, object obj) = GetTuple();(_, char c, _, string s, _) = GetTuple();}

  2、在switch表达式中使用弃元

  在switch表达式中,经常看到弃元的存在,因为switch表达式是输出表达式,当表达式中的每一项均不匹配时,它会抛出异常,而弃元可以消除这种异常,switch表达式中的弃元的作用就类似于switch语句中的default语句的作用:

    public class Point2D{public int X { get; set; }public int Y { get; set; }public void Deconstruct(out int x, out int y) => (x, y) = (X, Y);}
static void Print(object point){(var x, var y) = point switch{Point2D(> 0, > 0) p => p,_ => new Point2D()//如果没有弃元,当上面模式不匹配时将抛出异常 };}

  3、out关键字的参数

  在一些方法中可以看到有out关键字修饰的参数,但有时我们并不关心out参数输出的结果,这时就可以使用弃元来简化:  

    string value = "2021-07-14 18:00:00";bool isInt = int.TryParse(value, out _);//判断结果是否可以转换成int类型,而不关系转换成int类型后的值bool isBool = bool.TryParse(value, out _);//判断结果是否可以转换成bool类型,而不关系转换成bool类型后的值//判断结果是否可以转换成DateTime类型,而不关系转换成DateTime类型后的值bool isDateTime = DateTime.TryParseExact(value, "yyyy-MM-dd HH:mm:ss", System.Globalization.CultureInfo.CurrentCulture, System.Globalization.DateTimeStyles.None, out _);

  4、接收无用的表达式输出

  弃元可以将一些表达式的结果标记为舍弃,从而让表达式合法化,否则编译器可能会抛出警告:  

    //直接写1+1不合法,编译器无法通过,但是下面的写法是合法的_ = 1 + 1;

  还可以与 null合并运算符?? 结合,进行空指针验证:  

    public void Method(object arg){//原来的写法if (arg == null){throw new ArgumentNullException();}//等价写法_ = arg ?? throw new ArgumentNullException();//代替if验证空指针引用}

  我们通常使用async-await进行异步编程,当我们在一个async方法中启用一个异步操作而为使用await时,编译器会发出警告:

  

  而弃元的存在可以让我们消除这种警告:  

    static async Task Print(){_ = Task.Run(() =>{//something
        });await Task.CompletedTask;}

  

  注意点

  弃元表示不在使用的元素变量,因此一旦你使用弃元去接收值,那么就不应该通过弃元去获取值。但是,弃元符号(_)是一个合法变量符,我们可以声明单下划线的变量,一旦声明了弃元符号的变量,那么在后续的同一作用域要注意使用的是弃元还是变量!

  举个例子,可以好好体会:  

    static async Task Print(){//这里是弃元var (_, i) = (1, 2);(var _, var j) = (1, 2);string _ = "discards";//声明弃元符号字符串变量//这里是弃元,自动识别是弃元var (_, m) = (1, 2);(var _, var n) = (1, 2);var s = i switch{_ => _  //前面是弃元,后面是变量
        };Console.WriteLine(_);//识别为变量,输出discards//报错,此时识别为字符串bool isInt = int.TryParse(s, out _);//报错,此时识别为字符串_ = Task.Run(() =>{//something
        });await Task.CompletedTask;}

 

  参考文档:https://docs.microsoft.com/en-us/dotnet/csharp/fundamentals/functional/discards

 

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

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

相关文章

Linux——进程间通信——管道(文件)通信

目录 前言 一、有名管道 1、用法 2、管道分类 3、有名管道的创建 4、思考:如何进程a要将键盘获取的数据传递给另一个进程b? 5、有名管道实现进程间通信 二、无名管道 1、无名管道的创建 2、管道操作分为以下步骤 3、无名管道实现进程间通信 前言…

string类详解

文章目录1:构造string类1.1:方法1.2:测试2:size和length2.1:用途2.2:测试3:capacity3.1:用途3.2:测试4:clear4.1:用途4.2:测试5:empty5.1:用途5.2:测试6:reserve6.1:用途6.2:测试7:resize7.1:用途7.2:测试8:string的三种遍历8.1:方法一 for循环和[]重载8.2:方法二 迭代器8.2.1:…

基于CNTK/C#实现逻辑回归【附源码】

文章目录前言一、VS2022CNTK环境搭建二、逻辑回归代码构建1.逻辑回归构建2.训练数据的生成3.模型训练三、效果展示前言 本文基于CNTK实现逻辑回归二分类,并以之前的不同,本次使用C#实现,不适用python,python版的CNTK比较简单&…

Java多线程-ThreadPool线程池(三)

开完一趟车完整的过程是启动、行驶和停车,但老司机都知道,真正费油的不是行驶,而是长时间的怠速、频繁地踩刹车等动作。因为在速度切换的过程中,发送机要多做一些工作,当然就要多费一些油。 而一个Java线程完整的生命周期就包括:1、T1:创建(启动) 2、T2:运行(行驶)…

苹果IOS应用上架AppStore的流程与教程

快打包生成的苹果APP上架到苹果官方appstore商店的详细流程与教程第一步:创建app发布证书以及配置文件1、打开苹果开发者中心网站:https://developer.apple.com,点击右上角 Account 使用开发者账号登录,如下图所示:​编辑切换为居中添加图片注释,不超过 140 字(可选)2、…

基于IoT全链路实时质量-魔洛哥

简介: 通过基于IoT的全链路实时质量,业务使用狄仁杰进行全链路埋点后,可一键接入魔洛哥平台,实现终端问题的实时感知和链路分析,以及智能终端系统业务场景的全链路实时质量。整体方案接入成本低(分钟级别接入),可实现全链路的实时质量分析,以及精准的终端预警能力。帮…

JavaScript 51 JavaScript 严格模式

JavaScript 文章目录JavaScript51 JavaScript 严格模式51.1 "use strict" 指令51.2 声明严格模式51.3 "use strict"; 语法51.4 为什么使用严格模式?51.5 严格模式中不允许的事项51.6 对未来的保障51.7 警告51 JavaScript 严格模式 “use stric…

IDEA下载与安装,保姆级教程

这里写自定义目录标题1.搜索idea2.选择官方网站3.官网进入下载页面4.版本选择问题5. Ultimate和Community对比6.下载7.安装1.搜索idea 2.选择官方网站 以前idea的官网后面有官网俩字,现在没有了,你可以看他的具体网址,因为idea是Jetbrains公…

猿创征文|计算机学生必须掌握的学习工具

🍓个人主页:bit.. 🍒系列专栏:Linux(Ubuntu)入门必看 C语言刷题 数据结构与算法 目录 一.c/c使用的软件 二.GitHub和gitee的使用 三.学会如何去调试代码 修改bug 四.学习Linux上面的基本操作 五.java使用的软件 六.p…

【案例源码公开】国产AD+全志T3开发案例,为能源电力行业排忧解难!8/16通道

前 言 本文主要介绍基于全志科技T3(ARM Cortex-A7)国产处理器的8/16通道AD采集开发案例,使用核芯互联CL1606/CL1616国产AD芯片,亦适用于ADI AD7606/AD7616。CL1606/CL1616与AD7606/AD7616软硬件兼容。 备注: (1)创龙科技TL7606I模块使用AD芯片为核芯互联CL1606或ADI AD…

Softing连接解决方案——将FANUC数控机床数据集成到西门子工业边缘

2022年10月10日(哈尔),Softing发布了edgePlug FANUC CNC,其丰富了edgePlug产品系列。该产品系列基于Linux的Docker容器应用并为西门子工业边缘应用提供了控制器数据。 (Softing的edgePlug Docker容器产品为西门子工业边…

《Python+Kivy(App开发)从入门到实践》自学笔记:简单UX部件——Label标签

章节知识点总揽 4.2 Label标签 在Kivy中,Label小部件用于呈现文本,它仅支持ASCII和Unicode编码的字符串(不支持中文),在Label中,可以设置文本内容、字体、大小、颜色、对齐方式、换行、引用以及标记文字等…

【PCBA方案设计】快速体温计方案

一、电子体温计方案介绍 电子体温计由温度传感器,液晶显示器,纽扣电池,专用集成电路及其他电子元器件组成。能快速准确地测量人体体温,与传统的水银玻璃体温计相比,具有读数方便,测量时间短,测量…

DM数据库安装、登录和创建用户

DM数据库安装、登录和创建用户子安拉取镜像 wget -O dm8_docker.tar -c https://download.dameng.com/eco/dm8/dm8_20220822_rev166351_x86_rh6_64_ctm.tar docker load -i dm8_docker.tar docker images编写docker-compose.yml version: 3 services:dm8:image: dm8_single:v8.…

操作系统(九)进程通信

文章目录1 IPC1.1通信操作1.2通信链路的实现1.3通信分类1.3.1直接通信与间接通信直接通信间接通信1.3.2消息传递的特征1.4缓冲问题1.4.1容量问题2信号(signal)2.1原理2.2接收信号后处理方式2.3不足2.4实现3管道3.14消息队列5共享内存6socket机制1 IPC i…

为什么选择高防DNS云解析?

DNS(Domain Name System,域名服务器)是互联网的一项核心服务,是域名与对应IP地址进行转换的系统,可将易于记忆的域名转换为可由服务器识别的用于互连通信的数字IP地址。随着大数据时代的到来,传统DNS所存在…

C语言~指针变量

给自己找的基础啊~~ 给自己学 多谢大佬指点 别的勿扰 指针变量的基本操作基本操作 int a,*iptr,*jptr,*kptr; iptr &a; jptr iptr; *jptr 100; kptr NULL; 己址和己空间 指针变量也是一个变量,对应一块内存空间,对应一个内存地址…

DJ8-2 主存储器的组织

如何由存储芯片到存储器? 确定设计容量:多大设计容量 芯片的选用:多大容量,位数,多少片,如何分组 地址分配:将CPU提供的全部地址空间的哪些地址空间分配给所设计的存储器,确定各芯…

docker搭建zabbix服务

docker搭建zabbix服务zabbix简介1、本次安装zabbix的镜像版本2、zabbix组件2.1 创建子网2.2 MySQL容器2.3 zabbix-server-mysql容器2.4 zabbix-web-nginx-mysql容器2.5 zabbix-agent2容器2.6 zabbix-snmptraps容器3、zabbix访问3.1 中文字体修改zabbix简介 zabbix(…

esp32通过micropython-->MQTT--上传至腾讯云,实时显示温湿度数据保姆级教程(上)

esp32通过micropython-->MQTT--上传至腾讯云,实时显示温湿度数据保姆级教程(上)1.注册登录和创建产品:1.1注册账号/登录账号:1.2创建产品:1.注册登录和创建产品: 1.1注册账号/登录账号&…