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


猜你喜欢
- Spring * 监测每个Controller或方法的执行时长首先写一个类(TestInterceptor)让他继承HandlerInter
- 前言我们在 页面切换转场动画,英雄救场更有趣!介绍了 Hero 动画效果,使用 Hero 用于转场能够提供非常不错的体验。既然称之
- 一、现象在服务器上通过curl命令调用一个Java服务的查询接口,半天没有任何响应。关于该服务的基本功能如下:1、该服务是一个后台刷新指示器
- 本文所述实例实现将一张图片上传到指定的文件夹,然后在窗体上的PictrueBox控件中显示出来。具体功能代码如下:private void
- 需要的Maven<!--redis--> <dependency&g
- 有关临时对象的生命周期有三种情况:1)一般情况:临时性对象的被摧毁,应该是对完整表达式(full-expression)求值过程中的最后一个
- 这篇文章主要介绍了spring如何实现两个xml配置文件间的互调,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值
- 前言博主上个礼拜,已经实现了quarkus的native image应用的上线,经过两天的监控下来,一切运行指标良好,就是内存升到了100M
- 一、自己封装URLConnection 连接请求类 public void downloadFile1() { try{ &nb
- 一、解决的痛点 1、免搭建后端开发环境。 &n
- 前言1、下面是一个效果展示;2、先抱怨一下,在博客上面的抄袭真的非常严重,为了实现一个图片滑动验证,我搜索了挺久的资料,不过内容翻来覆去就是
- 本文所述为C#事务处理(Execute Transaction)的一个实例,包含了创建SqlTransaction 对象并用SqlConne
- 前言:在本文中,我们将详细讨论Java中的一个核心概念——线程的生命周期。我们将使用一个快速的图解,
- IntelliJ IDEA 安装后需要进行初始化配置已更加方便使用。本文整理了比较通用的安装后初始配置。本文的版本:IntelliJ IDE
- sql语句是写在对应的xml文件中首先要解决maven默认不加载xml文件的问题1.首先要写入相关配置文件在pom 导入下面内容
- 前言在我的申请下,公司终于购买了一台基于Android12.0的手机,然后我就开心的拿去安装测试了,发现程序崩溃了,于是我这里就写下来,An
- 记得老师讲课的时候,经常会用PPT遥控翻页笔来遥控幻灯片来给我们讲课,当时觉得非常有趣,由于这段时间接触了VSTO相关的开发,了解到了Off
- 什么是ByteBuddyByteBuddy是一个java的运行时代码生成库,他可以帮助你以字节码的方式动态修改java类的代码。为什么需要B
- 条码的应用已深入生活和工作的方方面面。在处理条码时,常需要和各种文档格式相结合。当需要在文档中插入、编辑或者删除条码时,可借助于一些专业的类
- 微信公众号提供了微信支付、微信优惠券、微信H5红包、微信红包封面等等促销工具来帮助我们的应用拉新保活。但是这些福利要想正确地发放到用户的手里