C# 12 新增功能实操!

前言

今天咱们一起来探索并实践 C# 12 引入的全新功能!

注意:使用这些功能需要使用最新的 Visual Studio 2022 版本或安装 .NET 8 SDK 。

主构造函数

主构造函数允许你直接在类定义中声明构造函数参数,并自动生成相应的属性。

主构造函数参数的最常见用途包括:

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

代码示例

将任何参数放在类型名称后面的括号中:

复制代码
`    public class CSharp12GrammarExercise`
`    {`
`        public static void OutputPrint()`
`        {`
`            var person = new Person("追逐时光者", 30);`
`            Console.WriteLine($"{person.Name}, {person.Age}");`
`        }`
`    }`

`    public class Person(string name, int age)`
`    {`
`        public string Name => name;`
`        public int Age => age;`
`    }`

以下代码初始化从主构造函数参数计算的两个只读属性:

复制代码
`    public class CSharp12GrammarExercise`
`    {`
`        public static void OutputPrint()`
`        {`
`            // 创建 Distance 结构体实例`
`            Distance distance = new Distance(10, 55);`
`            // 访问 Magnitude 和 Direction 属性`
`            Console.WriteLine($"Magnitude: {distance.Magnitude},Direction: {distance.Direction}");`
`        }`
`    }`

`    public readonly struct Distance(double dx, double dy)`
`    {`
`        public readonly double Magnitude { get; } = Math.Sqrt(dx * dx + dy * dy);`
`        public readonly double Direction { get; } = Math.Atan2(dy, dx);`
`    }`

集合表达式

集合表达式引入了一种新的简洁语法,用于创建常用集合值。可以使用展开运算符(..)将其他集合内联到这些值中。

下面的示例展示了集合表达式的用法:

复制代码
`        public static void CollectionExpressions()`
`        {`
`            // 创建一个数组`
`            int[] array = [55, 99, 100, 33];`

`            // 创建一个列表`
`            List<string> list = ["one", "two", "three", "five", "追逐时光者"];`

`            // 创建一个 Span`
`            Span<char> span = ['a', 'b', 'c', 'd', 'e', 'f', 'h', 'i', 'k'];`

`            // 创建一个交错二维数组`
`            int[][] two2D = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [88, 8, 9]];`
`        }`

展开运算符(..)示例代码:

展开运算符(集合表达式中的 ..)可将其参数替换为该集合中的元素。 参数必须是集合类型。 以下示例演示了展开运算符的工作原理:

复制代码
`            int[] item0 = [88, 2, 3];`
`            int[] item1 = [22, 5, 6];`
`            int[] item2 = [7, 99, 9];`
`            int[] totalList = [.. item0, .. item1, .. item2];`
`            foreach (var element in totalList)`
`            {`
`                Console.Write($"{element}, ");`
`            }`

没有.. 会有异常:

正常输出:

内联数组

内联数组用于提高应用程序性能,允许在结构体中创建固定大小的数组。虽然你可能不会自己声明内联数组,但当它们通过 System.Span<T>System.ReadOnlySpan<T> 从运行时 API 暴露出来时,你可以透明地使用它们。内联数组提供与不安全固定大小缓冲区类似的性能特性。

内联数组的声明与下面的结构类似:

复制代码
`    [System.Runtime.CompilerServices.InlineArray(20)]`
`    public struct Buffer`
`    {`
`        private int _element0;`
`    }`

你可以像使用其他数组一样使用它们:

复制代码
`        public static void InlineArrays()`
`        {`
`            var buffer = new Buffer();`
`            for (int i = 0; i < 20; i++)`
`            {`
`                buffer[i] = i;`
`            }`

`            foreach (var i in buffer)`
`            {`
`                Console.WriteLine(i);`
`            }`
`        }`

默认 lambda 参数

现在可以为 Lambda 表达式的参数定义默认值,语法和规则与将参数的默认值添加到任何方法或本地函数相同。

如果 lambda 表达式只有一个输入参数,则括号是可选的:

复制代码
`Func<double, double> testcube = x => x * x * x;`

两个或更多输入参数使用逗号加以分隔:

复制代码
`Func<int, int, bool> testForEquality = (x, y) => x == y;`

可以显式指定类型,如下面的示例所示:

注意:输入参数类型必须全部为显式或全部为隐式;否则,便会生成 CS0748 编译器错误!!

复制代码
`Func<int, string, bool> isTooLong = (int x, string s) => s.Length > x;`

任何类型的别名

可以使用 using 别名指令创建任何类型的别名,而不仅仅是命名类型。也就是说,你可以为元组类型、数组类型、指针类型或其他不安全类型创建语义别名。

使用 using 关键字为元组类型创建别名,并进行调用:

复制代码
`using PointTest = (int item1, int item2);`

`namespace HelloDotNetGuide.CSharp语法`
`{`
`    public class CSharp12GrammarExercise`
`    {`
`        public static void OutputPrint()`
`        {`
`            //使用 using 关键字为元组类型创建别名,并进行调用:`
`            PointTest point = (10, 20);`
`            Console.WriteLine($"输出:Item1={point.Item1}, Item2={point.Item2}");`
`        }`
`    }`
`}`

参考文章

DotNetGuide技术社区交流群

  • DotNetGuide技术社区是一个面向.NET开发者的开源技术社区,旨在为开发者们提供全面的C#/.NET/.NET Core相关学习资料、技术分享和咨询、项目框架推荐、求职和招聘资讯、以及解决问题的平台。
  • 在DotNetGuide技术社区中,开发者们可以分享自己的技术文章、项目经验、学习心得、遇到的疑难技术问题以及解决方案,并且还有机会结识志同道合的开发者。
  • 我们致力于构建一个积极向上、和谐友善的.NET技术交流平台。无论您是初学者还是有丰富经验的开发者,我们都希望能为您提供更多的价值和成长机会。

欢迎加入DotNetGuide技术社区微信交流群👪

相关推荐
追逐时光者7 小时前
C#字符串拼接的几种方式及其性能分析对比
【.net】·【c#】·【.net core】·【拾遗补漏】
追逐时光者2 天前
一个.NET开源、易于使用的屏幕录制工具
【.net】·【开源项目】
追逐时光者3 天前
好消息,在 Visual Studio 中可以免费使用 GitHub Copilot 了!
【visual studio】·【.net】·【c#】·【实用工具】·【ai编程】
追逐时光者5 天前
基于.NET WinForm开发的一款硬件及协议通讯工具
【.net】·【开源项目】·【winform】
追逐时光者5 天前
一款基于 .NET MVC 框架开发、功能全面的MES系统
【.net】·【c#】·【开源项目】·【.net core】
追逐时光者7 天前
C#/.NET/.NET Core技术前沿周刊 | 第 17 期(2024年12.09-12.15)
【.net】·【c#】·【.net core】·【技术前沿周刊】
追逐时光者7 天前
C#正则表达式快速入门
【.net】·【c#】·【.net core】·【拾遗补漏】
追逐时光者11 天前
一套以用户体验出发的.NET8 Web开源框架
【.net】·【c#】·【开源项目】·【.net core】