前言

作为.NET 8发布会的一部分,微软于11月14日发布了C#12的新功能,这也是目前.NET的最新版本。正如之前公布的那样,最显著的改进包括了集合表达式、主构造函数、任何类型的别名以及lambda表达式中参数提供默认值。

主构造函数

C#12扩展了主构造函数,现在可以在任何class和struct中创建主构造函数。 主构造函数不再局限于record类型。这一改进允许在类声明中直接定义构造函数参数。

主构造函数参数的用途有以下三点:

  • 作为 base() 构造函数调用的参数
  • 初始化成员字段或属性
  • 引用实例成员中的构造函数参数

主构造函数参数是在整个类定义范围内的参数,值得注意的是,编译器仅在 record 类型(record class 或 record struct 类型)中为主构造函数参数生成公共属性,从而可以简化成员管理,下面是主构造函数的代码示例:

public class BankAccount(string accountID, string owner)
{
public string AccountID { get; } = accountID;
public string Owner { get; } = owner; public override string ToString() => $"Account ID: {AccountID}, Owner: {Owner}";
}

集合表达式

集合表达式,简化了创建各种集合的语法,提供了一种统一的方法,在初始化数组、列表或跨度时,无需使用不同的语法,以下示例演示了集合表达式的使用:

// Create an array:
int[] a = [1, 2, 3, 4, 5, 6, 7, 8]; // Create a list:
List<string> b = ["one", "two", "three"]; // Create a span
Span<char> c = ['a', 'b', 'c', 'd', 'e', 'f', 'h', 'i']; // Create a jagged 2D array:
int[][] twoD = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]; // Create a jagged 2D array from variables:
int[] row0 = [1, 2, 3];
int[] row1 = [4, 5, 6];
int[] row2 = [7, 8, 9];
int[][] twoDFromVariables = [row0, row1, row2];

此外,展开运算符(集合表达式中的 ..)可将其参数替换为该集合中的元素,参数必须是集合类型,可以简化多个集合操作的过程。

int[] row0 = [1, 2, 3];
int[] row1 = [4, 5, 6];
int[] row2 = [7, 8, 9];
int[] single = [..row0, ..row1, ..row2];
foreach (var element in single)
{
Console.Write($"{element}, ");
}
// output:
// 1, 2, 3, 4, 5, 6, 7, 8, 9,

ref readonly 参数&内联数组

ref readonly 参数内联数组这两个新功能,可以增强原始内存处理能力,提高应用程序性能。内联数组使开发人员能够创建固定大小的 struct 类型数组,使开发人员能够优化代码以提高效率。内联数组速度很快,因为它们依赖于指定长度的精确布局。内联数组是一种具有单个字段的类型,并用指定数组长度的InlineArrayAttribute 进行标记。

[System.Runtime.CompilerServices.InlineArray(10)]
public struct Buffer
{
private int _element0;
} // Usage
var buffer = new Buffer(); for (int i = 0; i < 10; i++)
buffer[i] = i; foreach (var i in buffer)
Console.WriteLine(i);

此外,C#12还引入了拦截器Experimental属性两个试验性功能。用 Experimental 特性标记的程序集或模块中声明的所有类型都是实验性的。 如果访问其中任何一种类型,编译器都会发出警告。 可以禁用这些警告以试用实验性功能。拦截器允许将特定方法调用重新路由到不同的代码,它适用于一些高级场景,特别是允许更好的提前编译(AOT)。

lambda 表达式的输入参数

从C#12开始,Lambda 表达式中的参数可以提供默认值。这意味着可以为元素类型、数组类型、指针类型或其他不安全类型创建语义别名。

var IncrementBy = (int source, int increment = 1) => source + increment;

Console.WriteLine(IncrementBy(5)); // 6
Console.WriteLine(IncrementBy(5, 2)); // 7

1.异步 lambda

通过使用 async 和 await 关键字,你可以轻松创建包含异步处理的 lambda 表达式和语句。 例如,下面的代码示例包含一个调异步方法 ExampleMethodAsync。

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
button1.Click += async (sender, e) =>
{
await ExampleMethodAsync();
textBox1.Text += "\r\nControl returned to Click event handler.\n";
};
} private async Task ExampleMethodAsync()
{
// The following line simulates a task-returning asynchronous process.
await Task.Delay(1000);
}
}

2.表达式 lambda

表达式位于 => 运算符右侧的 lambda 表达式称为“表达式 lambda”。 表达式 lambda 会返回表达式的结果,并采用以下基本形式:

(input-parameters) => expression

3.语句 lambda

语句 lambda 与表达式 lambda 类似,只是语句包括在大括号中:

(input-parameters) => { <sequence-of-statements> }

4.lambda 表达式和元组

C# 语言提供对元组的内置支持。 可以提供一个元组作为 Lambda 表达式的参数,同时 Lambda 表达式也可以返回元组。 在某些情况下,C# 编译器使用类型推理来确定元组组件的类型。

可通过用括号括住用逗号分隔的组件列表来定义元组。 下面的示例使用包含三个组件的元组,将一系列数字传递给 lambda 表达式,此表达式将每个值翻倍,然后返回包含乘法运算结果的元组(内含三个组件)。

Func<(int, int, int), (int, int, int)> doubleThem = ns => (2 * ns.Item1, 2 * ns.Item2, 2 * ns.Item3);
var numbers = (2, 3, 4);
var doubledNumbers = doubleThem(numbers);
Console.WriteLine($"The set {numbers} doubled: {doubledNumbers}");
// Output:
// The set (2, 3, 4) doubled: (4, 6, 8)

总结

综上所述,C#12的新功能为开发者带来了更多的灵活性、可读性和效率。无论是是新手还是有经验的开发者,都能从这些功能中受益。无论是代码的编写、调试还是性能优化,C#12为提供了更多的工具和选项。因此,开发者应紧跟技术的步伐,不断学习和应用C#12的新功能,以保持在C#开发领域的竞争力。

有关C#12可用功能的更多信息,可访问官方文档

扩展链接:

Redis从入门到实践

一节课带你搞懂数据库事务!

Chrome开发者工具使用教程

从表单驱动到模型驱动,解读低代码开发平台的发展趋势

低代码开发平台是什么?

基于分支的版本管理,帮助低代码从项目交付走向定制化产品开发

C#12新功能有哪些?的更多相关文章

  1. Windows 10 20H1 2004新功能

    Windows 10的年度更新版本20H1即将问世.目前可以从insider preview渠道中获得.这个版本中看上去对搜索功能做了不小的改进.包括搜索的磁盘占用率以及搜索的一些展示方式. 其它的一 ...

  2. Docker 1.12.0将要发布的新功能

    Docker 1.12.0将要发布的新功能 导读 按计划,6/14 是1.12.0版本的 feature冻结 的日子,再有两个星期Docker 1.12.0也该发布了.这里列出来的新功能,都是已经合并 ...

  3. 微软Power BI 每月功能更新系列——12月Power BI 新功能学习

    Power BI Desktop12月产品功能摘要 Power BI 作为实力宠粉达人每月更新不来点新花样,怎么对得起翘首期待的实力铁粉您嘞!一起来看看这一次的Power BI版本的更新又给我们带来了 ...

  4. MySQL 5.7 Replication 相关新功能说明

    背景: MySQL5.7在主从复制上面相对之前版本多了一些新特性,包括多源复制.基于组提交的并行复制.在线修改Replication Filter.GTID增强.半同步复制增强等.因为都是和复制相关, ...

  5. CentOS以及Oracle数据库发展历史及各版本新功能介绍, 便于构造环境时有个对应关系

    CentOS版本历史 版本 CentOS版本号有两个部分,一个主要版本和一个次要版本,主要和次要版本号分别对应于RHEL的主要版本与更新包,CentOS采取从RHEL的源代码包来构建.例如CentOS ...

  6. SQLSERVER2014中的新功能

    SQLSERVER2014中的新功能 转载自:http://blog.csdn.net/maco_wang/article/details/22701087 博客人物:maco_wang SQLSER ...

  7. 初识 MySQL 5.6 新功能、参数

    摘要: 继上一篇的文章 初识 MySQL 5.5 新功能.参数 之后,现在MySQL5.6 针对 MySQL5.5 各个方面又提升了很多,特别在性能和一些新参数上面,现在看看大致提升了哪些方面(后续不 ...

  8. Visual Studio 2013 新功能 Memory Dump 分析器

    本文为 Dennis Gao 原创技术文章,发表于博客园博客,未经作者本人允许禁止任何形式的转载. TechEd2013 发现新功能 12月5日和6日,在国家会议中心参加了微软的 TechEd2013 ...

  9. ActiveReports 9 新功能:借助目录(TOC)控件为报表添加目录功能

    在最新发布的ActiveReports 9报表控件中添加了多项新功能,以帮助你在更短的时间里创建外观绚丽.功能强大的报表系统,本文将重点介绍新增文档目录控件(TOC),通过拖拽操作便可添加报表目录. ...

  10. JPA2.1 中三个提升应用性能的新功能

    经常在网上看到开发者们抱怨 JPA 性能低下的帖子或文章,但如果仔细查看这些性能问题,常会发现导致问题的根本原因大致包括以下几个: 使用过多的 SQL 查询从数据库中获取所需的实体信息,即我们常说的n ...

随机推荐

  1. 分布式TCC事务相关问题

    TCC分别是Try,Confirm,Cancel,分为三阶段. 第一阶段Try:业务检查及资源预留,尝试事务操作但不提交. 第二阶段Confirm:事务操作提交. 第三阶段Cancel:如果Try阶段 ...

  2. Ubuntu虚拟机安装以及在Ubuntu上安装pycharm

    一.在VMware上安装Ubuntu操作系统 1.下载Ubuntu镜像文件 下载地址:清华大学开源软件镜像站 | Tsinghua Open Source Mirror 参考文章:Ubuntu系统下载 ...

  3. 《SQL与数据库基础》08. 多表查询

    目录 多表查询 多表关系 一对多 多对多 一对一 多表查询概述 分类 内连接 外连接 自连接 联合查询 子查询 分类 标量子查询 列子查询 行子查询 表子查询 案例 本文以 MySQL 为例 多表查询 ...

  4. 想了解API接口,这一篇就够了

    API(Application Programming Interface)接口,对于大多数人来说可能还比较陌生,但实际上我们每天都在与它打交道.无论是使用手机上的应用程序,还是在网上购物,都少不了A ...

  5. Dynamics 365 自定义渠道的步骤

    1.创建2个实体:渠道[new_flashinfosmschannel].消息模板(配置窗体)注意:如果想用标准消息模板,可以不用创建消息模板 标准消息模板效果: 2.导出解决方案,往XML增加一个关 ...

  6. 内网DNS解析☞dnsmasq

    内网DNS解析☞dnsmasq 目录 内网DNS解析☞dnsmasq 简介: 安装dnsmasq 问题: 1.怎么让172.30.1.* 与172.30.2.* 两个网段能互相访问? 2.firewa ...

  7. 关闭Google"阻止了登录尝试"方法, 其他设备也能登录Gmail等谷歌服务

    首先登录谷歌账户,  访问 https://www.google.com/settings/security/lesssecureapps 把"不够安全的应用的访问权限" 启用打勾 ...

  8. BY组态-低代码web可视化组件

    简介 BY组态是贵州九元四方科技完全自主研发的集实时数据展示.动态交互等一体的全功能可视化平台.帮助物联网.工业互联网.电力能源.水利工程.智慧农业.智慧医疗.智慧城市等场景快速实现数字孪生.大屏可视 ...

  9. QFluentWidgets: 基于 C++ Qt 的 Fluent Design 组件库

    简介 QFluentWidgets 是一个基于 Qt 的 Fluent Designer 组件库,内置超过 150 个开箱即用的 Fluent Designer 组件,支持亮暗主题无缝切换和自定义主题 ...

  10. Use Closures Not Enumerations

    http://c2.com/  Use Closures Not Enumerations I was really disappointed when this turned out not to ...