经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C# » 查看文章
C#12新功能有哪些?
来源:cnblogs  作者:葡萄城技术团队  时间:2023/12/5 12:10:33  对本文有异议

前言

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

主构造函数

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

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

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

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

  1. public class BankAccount(string accountID, string owner)
  2. {
  3. public string AccountID { get; } = accountID;
  4. public string Owner { get; } = owner;
  5. public override string ToString() => $"Account ID: {AccountID}, Owner: {Owner}";
  6. }

集合表达式

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

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

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

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

ref readonly 参数&内联数组

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

  1. [System.Runtime.CompilerServices.InlineArray(10)]
  2. public struct Buffer
  3. {
  4. private int _element0;
  5. }
  6. // Usage
  7. var buffer = new Buffer();
  8. for (int i = 0; i < 10; i++)
  9. buffer[i] = i;
  10. foreach (var i in buffer)
  11. Console.WriteLine(i);

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

lambda 表达式的输入参数

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

  1. var IncrementBy = (int source, int increment = 1) => source + increment;
  2. Console.WriteLine(IncrementBy(5)); // 6
  3. Console.WriteLine(IncrementBy(5, 2)); // 7

1.异步 lambda

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

  1. public partial class Form1 : Form
  2. {
  3. public Form1()
  4. {
  5. InitializeComponent();
  6. button1.Click += async (sender, e) =>
  7. {
  8. await ExampleMethodAsync();
  9. textBox1.Text += "\r\nControl returned to Click event handler.\n";
  10. };
  11. }
  12. private async Task ExampleMethodAsync()
  13. {
  14. // The following line simulates a task-returning asynchronous process.
  15. await Task.Delay(1000);
  16. }
  17. }

2.表达式 lambda

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

  1. (input-parameters) => expression

3.语句 lambda

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

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

4.lambda 表达式和元组

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

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

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

总结

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

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

扩展链接:

Redis从入门到实践

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

Chrome开发者工具使用教程

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

低代码开发平台是什么?

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

原文链接:https://www.cnblogs.com/powertoolsteam/p/17869578.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号