首页 > 编程语言 >【C#】-弃元(_)的使用-02

【C#】-弃元(_)的使用-02

时间:2023-05-26 13:22:57浏览次数:26  
标签:02 C# switch 弃元 int bool var out

从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;
    }

标签:02,C#,switch,弃元,int,bool,var,out
From: https://www.cnblogs.com/VisionCodeBlog/p/17434458.html

相关文章

  • THUPC2023游记
    2023.2THUPC报名!和unputdownable,猫猬兽组队,队名XJ五队。devin让我们填毕业年份2028。收货地址填了重庆市第114514中学冯阳阳纪念谷学校。upd性别填其他被拒了。2023.3.4THUPC2023初赛测试赛!\(3\)月\(4\)日\(13\)点联络群消息:##OJ网址thupc2023.thusa......
  • Oracle
    substr函数:截取字符串语法:SUBSTR(string,start,[length])string:表示源字符串,即要截取的字符串。start:开始位置,从1开始查找。如果start是负数,则从string字符串末尾开始算起。length:可选项,表示截取字符串长度。instr函数:返回子字符串在源字符串中的位置语法:INSTR(string,child_s......
  • 【C#】- ??、 ?、 ?: 、?.、?[ ] 问号的各种用法
    1.可空类型修饰符(?)引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空。例如:stringstr=null;是正确的,inti=null;编译器就会报错。为了使值类型也可为空,就可以使用可空类型,即用可空类型修饰符"?“来表示,表现形式为"T?”例如:int?表示可空的整形,DateTime?表示可......
  • Rust async 编程
    Rustasync编程AsynchronousProgramminginRust:https://rust-lang.github.io/async-book/中文书名《Rust异步编程指南》:https://github.com/rustlang-cn/async-bookRust语言圣经(RustCourse):https://course.rs/advance/async/getting-started.html一、GettingStarted1.......
  • 如何避免Salesforce Apex代码中5个常见错误,提升开发技巧?
    编码是一门需要严谨和谨慎的技术,即使是有经验的开发人员也会犯错。一些最常见的编程错误,可能会导致严重的后果。因此,作为一名开发人员,了解并避免这些错误是非常重要的。本篇文章将为学习者介绍在编写Apex代码时一定要规避的5个错误。易错点1缺乏学习编程语言的能力学习编码时......
  • 算法学习记录(模拟枚举贪心题单):四舍五入(未AC)
    题目链接https://ac.nowcoder.com/acm/contest/20960/1004题目分析注意当第i位为9是,此时进位就是0,但是0<5,所以就不能再用i+1进行判断了。所以对于这种情况可以再添加一个其他变量。未AC代码//主要解决问题,因为使用i+1去判断是否要进位的//逢9进位后就会变成0,那么第i+1位......
  • Hackathon 代码黑客马拉松采访复盘
    AIGCHackathon2023北京站我参加了选手采访提纲,这里我感觉有些点可以分享给大家。之前复盘的链接:下面是采访我的回答内容:1.请向大家简单介绍一下自己吧?子木,社区名称为程序员泥瓦匠,年龄三十岁,毕业于温州医科大学。有8年SaaS经验,曾在有赞和售后宝等SaaS公司工作。兴......
  • 分享一个国内可用的ChatGPT网站,免费无限制,支持AI绘画 - AI 百晓生
    背景ChatGPT作为一种基于人工智能技术的自然语言处理工具,近期的热度直接沸腾......
  • 【C#】-弃元(_)的使用
    从C#7.0开始,C#支持弃元,这是一种在应用程序代码中人为取消使用的占位符变量。简单来说,弃元的作用就是告诉编译器和其他读取代码的文件你打算忽略表达式的结果。当我们不需要或不使用赋值的结果时,就可以使用弃元。我们在代码中一定遇到过这种苦恼:staticvoidMain(string[]a......
  • OnlineDictionary 倒计时体会
     电子辞典终于要结项了,这几天没命写报告,怎么会有这么多报告要写?GOD!有印象的生活是张开眼就开始写报告,画图,写到睡觉。Why theywant somanykindsofreports?真是要人命!  这次的项目,说实话,学到了很多,团队合作,互相体谅,技术学习。这些都是不可言谈的经......