C#12新功能有哪些?
前言
作为.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可用功能的更多信息,可访问官方文档。
扩展链接:
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
叮咚,你的微信年度聊天报告请查收「GitHub 热点速览」
本周热点项目 WeChatMsg 是一个微信记录提取工具,据说它还能帮你分析聊天记录、生成你的年度聊天报告。而又到了年底,部分不幸的小伙伴要开始写年度总结了,这时候 self-operating-computer 就能让你的电脑变成熟,在你的指示下写完你的年度汇报。 除了更智能的电脑,本周 AnimateAnyone 一开源便获得了 5k star,它是一个让图片变成视频的工具。能做什么?让你的卡片小姐姐们动起来! 最后,一定不能错过的就是 TrollStore,让你的苹果更加地贴心,装上一切你想要的应用。 以下内容摘录自微博@HelloGitHub 的 GitHub Trending 及 Hacker News 热帖(简称 HN 热帖),选项标准:新发布 | 实用 | 有趣,根据项目 release 时间分类,发布时间不超过 14 day 的项目会标注 New,无该标志则说明项目 release 超过半月。由于本文篇幅有限,还有部分项目未能在本文展示,望周知 🌝 本文目录 1. 本周特推 1.1 微信年度报告:WeChatMsg 1.2 让小姐姐动起来:AnimateAnyone ...
- 下一篇
GaussDB技术解读系列:如何迁移到GaussDB?
迁移是数据库选型过程中客户最为关心的话题之一,经过大量的沟通调研,我们总结了三个客户在数据库迁移方面的主要期望:迁移不影响业务运行(安心),迁移不能丢数据(放心),迁移实施起来简单(省心)。 本文从客户视角的三个疑问出发,一起了解华为云GaussDB数据库的迁移解决方案具有哪些核心技术,如何做到让客户在迁移过程中感到安心、放心、省心。 问题一:能不能搬? 每种数据库都有自己的一些特定的“脾气”,比如Oracle的语言直接在GaussDB上运行不一定能工作,这个就是所谓的“语言不通”,这种场景称之为“异构数据库的迁移”,“语言不通”是长期以来异构数据库迁移替换的最大技术障碍。下面我们从技术和效果两方面来看。 技术方面,华为是怎么解决的? 华为的迁移套件中有一款叫UGO的工具,它像“翻译大师一样”,把这个难题分成两部分来看: 第一部分读懂Oracle语言:Oracle的语法对应一个个巨大的树形结构,并由一些关键元素构成,比如一条Oracle建表语句,表名是什么,有几列,每列的名字是什么等等。UGO具有专属的语法分析器,能够顺着语法树和枚举探测出每条Oracle的语句元素构成,这样最终理解了...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7安装Docker,走上虚拟化容器引擎之路
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Linux系统CentOS6、CentOS7手动修改IP地址
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS8编译安装MySQL8.0.19
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装