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

作者:痕迹g 时间:2021-10-10 07:49:29 

在 .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个新特 * 的支持!

来源:https://www.cnblogs.com/zh7791/p/15222578.html

标签:C#,新特性
0
投稿

猜你喜欢

  • C# char类型字符转换大小写的实现代码

    2021-07-27 19:21:09
  • C# 打开电子邮件软件的具体方法

    2022-07-02 10:53:07
  • 详解JAVA Spring 中的事件机制

    2022-01-13 05:26:33
  • C#线性渐变画刷LinearGradientBrush用法实例

    2022-01-21 05:29:43
  • Java中List.of()和Arrays.asList()的区别及原因分析

    2023-08-06 00:33:16
  • springboot FeignClient注解及参数

    2021-07-09 21:59:07
  • Java编程中的一些常见问题汇总

    2022-01-08 18:05:46
  • Java实现PDF转为Word文档的示例代码

    2021-10-05 02:19:26
  • Java零基础精通方法篇

    2021-08-29 12:07:58
  • servlet之session简介_动力节点Java学院整理

    2023-07-07 00:51:07
  • Springmvc完成ajax功能实例详解

    2021-09-07 23:23:25
  • Java实现FIFO任务调度队列策略

    2021-09-19 09:05:37
  • android实现简单拼图游戏

    2021-11-17 09:28:23
  • SpringBoot借助spring.factories文件跨模块实例化Bean

    2021-12-01 18:22:41
  • java使用@Scheduled注解执行定时任务

    2021-09-16 08:37:16
  • C# SQlite操作方法小结

    2021-10-01 15:56:09
  • SpringCloud Edgware.SR3版本中Ribbon的timeout设置方法

    2023-03-07 10:45:46
  • spring boot 枚举使用的坑整理

    2022-09-17 09:03:15
  • vs 中C#项目读取JSON配置文件的方法

    2022-09-22 15:04:05
  • java利用数组随机抽取幸运观众

    2023-11-11 11:14:33
  • asp之家 软件编程 m.aspxhome.com