• C# 9.0 新特性之目标类型推导 new 表达式


    阅读本文大概需要 2 分钟。

    呼~~,每次过完一个周末,写作就失去了动力,一两天才能缓过来。尽管如此,还是要坚持写好每一篇文章的。宁缺毋滥嘛,宁愿发文的频率低一点,也要保证文章的质量,至少排版不能差,行文要流畅,错别字不能有。

    关于类型推导想必大家都很熟悉,它是在 var 关键字引入的时候引入 C# 的。

    var i = 10;
    var u = new User();
    

    编译器会通过右边的字面量自动推导左边变量的类型,这种推导方式可以归纳为:从上下文右边推导出左边的类型。我们不妨把它称为源类型推导(Source-typed inferring,参考 Target-typed 自创的术语)。

    相应的,有源类型推导就有目标类型推导 (Target-typed inferring),它是指从上下文左边推导出右边的类型。比如数组的初始化和 Lambda 表达式常常是目标类型推导的表达式。举个例子:

    // 没有使用类型推导
    string[] s = new string[] { "a", "b" };
    // 目标类型推导(左推右)
    string[] s = new { "a", "b" };
    string[] s = new [] { "a", "b" };
    
    // 没有使用类型推导
    Users.FirstOrDefault<User>(u => u.id = 123);
    // 目标类型推导(左推右)
    Users.FirstOrDefault(u => u.id = 123);
    

    这次在 C# 9 中,增加了用户定义类型 new 表达式的目标类型推导,即通过上下文左边自动推导 new 表达式的类型,从而在使用 new 构造时省略类型的指定,请看示例:

    // C# 9 之前
    Point p = new Point(3, 5);
    
    // C# 9
    Point p = new (3, 5);
    

    除此之外,C# 9 也增加了操作符 ???: 的目标类型推导支持。之前这两个操作符必须要求两边的操作对象都是相同的类型,否则会编译报错。而在 C# 9 中,只要目标类型是操作对象共同的基类就不再会编译报错了,比如:

    // Student 和 Customer 拥有共同的父类 Person
    Person person = (Person)(student ?? customer); // C# 9 之前
    Person person = student ?? customer; // C# 9
    
    // 可空类型,0 和 null 都可以隐式转换为 int? 类型
    int? result = b ? 0 : (int?)null; // C# 9 之前
    int? result = b ? 0 : null; // C# 9
    

    其实本文的核心就一句代码:

    Point p = new (3, 5);
    

    却一不小心啰嗦了这么一堆。但讲真,学习新的知识不是要死记硬背,而要学会归类推理,举一反三,经常思考,最好能形成自己的一种思维习惯,这样学习才会变成一件水到渠成的事。多看我的文章,希望你能学到的不仅仅是生硬的编程知识点,也希望我的行文风格和思维习惯对你有所启发。

  • 相关阅读:
    android自定义Dialog
    go笔记-内存回收分析、内存统计信息字段释义
    go笔记-defer以及性能
    go笔记-goroutine和panic
    并发编程-高性能IO-reactor模式
    go笔记-查看coredump:delve调试工具
    IO多路复用[转]
    kubernates 1.20.6安装
    JavaScript 数组元素的一些操作
    如何理解 Java 多线程
  • 原文地址:https://www.cnblogs.com/willick/p/13139093.html
Copyright © 2020-2023  润新知