C#9.0推出的4个新特性介绍

在 .NET 5.0 的发布中,不仅统一了框架,微软还在C#9.0中推出了一些新特性。

本版本中,印象深刻的功能:

  • Init-only setters (初始化设置器)
  • Records (记录)
  • Top-level statements (顶级语句)
  • Pattern matching (模式匹配)

Init-only setters (初始化设置器)

以前,使用不可变数据实例化对象必须在构造函数中通过将值作为参数传递来完成。现在,它已被简化为使用语法 init。它在对象创建期间初始化不可变数据,这允许开发人员创建不可变属性。

参考常规代码:

class Customers
{
    public int CustomerId { get; }
    public string CustomerName { get; set; }

    public Customers(int customerId)
    {
        CustomerId = customerId;
    }

    static void Main(string[] args)
    {
        var customers = new Customers(1045)
        {
            CustomerName = "Tyson"
        };

        //customerid 不能设置,因为该属性是只读
        customers.CustomerId = 1099;
    }
}

使用 Init-only setters:

class Customers
{
    public int CustomerId { get; init; }
    public string CustomerName { get; set; }

    static void Main(string[] args)
    {
        var customers = new Customers()
        {
            CustomerId = 1045,
            CustomerName = "Tyson"
        };

        //CS8852:只能在对象初始值设定项中或在实例构造函数或...分配
        customers.CustomerId = 1099;
    }
}

Records (记录)

记录允许我们像处理值而不是属性集合一样处理对象。由于记录主要处理不可变状态,因此它们很灵活,也最适合用于数据而不是功能。
在以下示例中,我使用 with 表达式创建了一个新记录,该记录从另一个记录继承值。

参考常规代码:

class SalesOrder
{
    public int OrderId { get; init; }
    public string ProductName { get; init; }
    public int Quantity { get; init; }

    static void Main(string[] args)
    {
        SalesOrder order = new SalesOrder { OrderId = 1, ProductName = "Mobile", Quantity = 2 };

        //修改ProductName
        SalesOrder newOrder = new SalesOrder { OrderId = order.OrderId, ProductName = "Laptop", Quantity = order.Quantity };
    }
}

使用 Records:

public record SalesOrder
{
    public int OrderId { get; init; }
    public string ProductName { get; init; }
    public int Quantity { get; init; }

    static void Main(string[] args)
    {
        SalesOrder order = new SalesOrder { OrderId = 1, ProductName = "Mobile", Quantity = 2 };

        SalesOrder newOrder = order with { ProductName = "Laptop" };
    }
}

Top-level statements (顶级语句)

此功能可帮助软件开发人员从程序中排除不需要的代码。顶级语句可以用一行替换所有重复代码。

参考常规代码:

using System;

namespace CSharp9
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Welcome!");
        }
    }
}

使用 top-level statements:

using System;

Console.WriteLine("Welcome !");

更准确地说,我们可以使用:

System.Console.WriteLine("Welcome !");

Pattern matching (模式匹配)

C# 9.0 包含许多新模式,但在这里我们将讨论关系模式和逻辑模式。

  • 关系模式
    这些模式与诸如 <、<=、> 和 >= 之类的关系运算符一起使用。
  • 逻辑模式
    这些模式与逻辑运算符如 and、or 和 not 一起使用。

参考代码:

public class SalesOrder
{
    public int OrderId { get; set; }
    public string ProductName { get; set; }
    public int Quantity { get; set; }
    public int TotalCost { get; set; }

    public double GetTotalCost() => TotalCost switch
    {
        500 or 600  => 10,
        < 1000 => 10 * 1.5,
        <= 10000 => 10 * 3,
        _ => 10 * 5
    };
}

class CSharpFeatures
{
    static void Main(string[] args)
    {
        SalesOrder newOrderforCustomer1 = new SalesOrder() { OrderId = 1, ProductName = "Camera", Quantity = 1, TotalCost = 5000 };
        newOrderforCustomer1.GetTotalCost();
        SalesOrder newOrderforCustomer2 = new SalesOrder() { OrderId = 2, ProductName = "Pen", Quantity = 1, TotalCost = 500 };
        newOrderforCustomer2.GetTotalCost();
    }
}

结论

借助这些功能,C# 9.0 可帮助程序员轻松处理数据(记录)、形状代码(模式匹配)和简化代码(顶级语句)。

如果想了解更多关于 C# 9.0 正式版中的新功能,请阅读此文档

以上所述是小编给大家介绍的C#9.0推出的4个新特性,希望对大家有所帮助。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • 浅析C# 9.0 新特性之 Lambda 弃元参数

    大家好,这是 C# 9.0 新特性短系列的第 5 篇文章. 弃元(Discards) 是在 C# 7.0 的时候开始支持的,它是一种人为丢弃不使用的临时虚拟变量.语法上它是用来赋值的,但它却不被分配存储空间,即没有值,所以不能从中读取值.弃元用 _(下划线) 表示,下划线是一个关键字,只能赋值,不能读取,例如: 在 C# 7.0 中,弃元的使用场景主要有下面四种: 元组和对象的解构 使用 is 和 switch 的模式匹配 对具有 out 参数的方法的调用 作用域内独立使用场景 针对这几个场景,

  • C# 9.0新特性——扩展方法GetEnumerator支持foreach循环

    1.介绍 我们知道,我们要使一个类型支持foreach循环,就需要这个类型满足下面条件之一: 该类型实例如果实现了下列接口中的其中之一: System.Collections.IEnumerable System.Collections.Generic.IEnumerable<T> System.Collections.Generic.IAsyncEnumerable<T> 该类型中有公开的无参GetEnumerator()方法,且其返回值类型必须是类,结构或者接口,同时返回值类型

  • C# 9 新特性之增强的foreach详解

    Intro 在 C# 9 中增强了 foreach 的使用,使得一切对象都有 foreach 的可能 我们来看一段代码,这里我们试图遍历一个 int 类型的值 思考一下,我们可以怎么做使得上面的代码编译通过呢? 迭代器模式 迭代器模式,提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示. 迭代器模式是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可以让外部代码透明地访问集合内部的数据. foreach 其实是一个迭代器模式的语法糖

  • C#9新特性init only setter的使用

    C# 9 中新支持了 init 关键字,这是一个特殊的 setter,用来指定只能在对象初始化的时候进行赋值,另外支持构造器简化的写法,比如:Target-typed new expression 在已知类型的情况下可以使用 new() 来代表构造方法的简化用法,可以简化字段的声明,也可以简化一次声明多个相同类型的变量 Sample 来看一个示例,我们定义一个测试用的 Person 类,测试代码如下: public class Person { public int Age { get; ini

  • c# 9.0新特性——模块初始化器

    作者:MarkKang 出处:https://www.cnblogs.com/markkang/ 1 背景动机 关于模块或者程序集初始化工作一直是C#的一个痛点,微软内部外部都有大量的报告反应很多客户一直被这个问题困扰,这还不算没有统计上的客户.那么解决这个问题,还有基于什么样的考虑呢? 在库加载的时候,能以最小的开销.无需用户显式调用任何接口,使客户做一些期望的和一次性的初始化. 当前静态构造函数方法的一个最大的问题是运行时会对带有静态构造函数的类型做一些额外的检查.这是因为要决定静态构造函数

  • 浅谈C# 9.0 新特性之只读属性和记录

    大家好,这是 C# 9.0 新特性系列的第 4 篇文章. 熟悉函数式编程的童鞋一定对"只读"这个词不陌生.为了保证代码块自身的"纯洁",函数式编程是不能随便"弄脏"外来事物(参数.变量等)的,所以"只读"对函数式编程非常重要. 为了丰富 C# 对函数式编程支持,较新的 C# 版本引入了一些很有用的新特性.比如 C# 8 中就对 struct 类型的方法增加了 readonly 修饰符支持,被 readonly 修饰的方法是不能

  • 关于C#10 新特性 Lambda 优化

    目录 1.Natural types for lambdas 2.Lambda Ref/Out/In Parameter Modifier 3.Lambda Return Type 4.Natual types for method 5.Lambda Attribute 6.More 前言: C# 10 对于 Lambda 做了很多的优化,我们可以在 C# 中更加方便地使用委托和 Lambda 了,下面就来看一些示例 1.Natural types for lambdas C# 10 可以更好做

  • C#9.0新特性详解——顶级程序语句(Top-Level Programs)

    1 背景与动机 通常,如果只想用C#在控制台上打印一行"Hello World!",这可不是Console.WriteLine("Hello World!");一条语句就可以搞定的,还涉及到其他必要基础代码(如定义类和入口函数Main),例如下面: using System; class Program { static void Main() { Console.WriteLine("Hello World!"); } } 就打印一句"

  • C#9新特性之增强的模式匹配

    Intro C# 9 中进一步增强了模式匹配的用法,使得模式匹配更为强大,我们一起来了解一下吧 Sample C# 9 中增强了模式匹配的用法,增加了 and / or / not 操作符,而且可以直接判断属性,来看一下下面的这个示例: var person = new Person(); // or // string.IsNullOrEmpty(person.Description) if (person.Description is null or { Length: 0 }) { Con

  • C# 9.0新特性——只初始化设置器

    自C#1.0版本以来,我们要定义一个不可变数据类型的基本做法就是:先声明字段为readonly,再声明只包含get访问器的属性.例子如下: 1.背景与动机 自C#1.0版本以来,我们要定义一个不可变数据类型的基本做法就是:先声明字段为readonly,再声明只包含get访问器的属性.例子如下: struct Point { public int X { get; } public int Y { get; } public Point(int x, int y) { this.X = x; th

  • C# 9 新特性——record的相关总结

    Intro C# 9 中引入了 record,record 是一个特殊类,用它来实现 model 在有些情况下会非常的好用 Sample record RecordPerson { public string Name { get; init; } public int Age { get; init; } } record RecordPerson2(string Name, int Age); public static void MainTest() { var p1 = new Reco

随机推荐