C#12 新功能盘点 哪个最实用?

2023-11-22 13:53:34 浏览数 (1)

前言

.NET 8北京时间11月15日正式版发布,同时C#12也正式上线, 据说C#12让你的编码体验更加高效和愉快。

它可以让你使用简单而优雅的语法在任何类和结构中创建主构造函数。不再需要样板代码来初始化你的字段和属性。

使用简洁且富有表现力的语法创建数组、跨度和其他集合类型时会感到高兴。对 lambda 表达式中的参数使用新的默认值。

不再需要重载或空检查来处理可选参数。你甚至可以使用usingalias 指令为任何类型添加别名,而不仅仅是命名类型!本文将总结C#12的几个功能,你觉得哪个最实用?

1、集合表达式

在 C# 12 之前,创建集合需要针对不同场景使用不同的语法。初始化所需的与or不同的语法。

以下是创建集合的几种方法:

代码语言:javascript复制
int[] x1 = new int[] { 1, 2, 3, 4 };
int[] x2 = Array.Empty<int>();
WriteByteArray(new[] { (byte)1, (byte)2, (byte)3 });
List<int> x4 = new() { 1, 2, 3, 4 };
Span<DateTime> dates = stackalloc DateTime[] { GetDate(0), GetDate(1) };
WriteByteSpan(stackalloc[] { (byte)1, (byte)2, (byte)3 });

2、任何类或结构上的主构造函数

C# 12 扩展了主构造函数以适用于所有类和结构,而不仅仅是记录。

主构造函数允许在声明类时定义构造函数参数:

代码语言:javascript复制
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}";
}

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

  • 作为 base() 构造函数调用的参数。
  • 初始化成员字段或属性。
  • 在实例成员中引用构造函数参数。
  • 删除依赖注入中的样板。

3、别名任意类型

别名类型是从代码中删除复杂类型签名的便捷方法。

using从 C# 12 开始,其他类型在别名指令中有效。

例如,这些别名在早期版本的 C# 中无效:

代码语言:javascript复制
using intArray = int[]; // Array types.
using Point = (int x, int y);  // Tuple type
using unsafe ArrayPtr = int*;  // Pointer type (requires "unsafe")

详解-->C#12实用的新功能:类型的别名

4、默认 lambda 参数

从 C# 12 开始,你可以在 lambda 表达式中声明默认参数:

代码语言:javascript复制
var IncrementBy = (int source, int increment = 1) => source   increment;
Console.WriteLine(IncrementBy(5)); // 6
Console.WriteLine(IncrementBy(5, 2)); // 7

5、内联数组

运行时团队和其他库作者使用内联数组来提高应用的性能。内联数组使开发人员能够创建固定大小的 struct 类型数组。

具有内联缓冲区的结构应提供类似于不安全的固定大小缓冲区的性能特征。

你可能不会声明自己的内联数组,但当它们从运行时API作为 System.Span 或 System.ReadOnlySpan 对象公开时,你将透明地使用这些数组。

代码语言:javascript复制
[System.Runtime.CompilerServices.InlineArray(10)]
public struct Buffer
{
    private int _element0;
}

它们的用法与任何其他数组类似:

代码语言:javascript复制
var buffer = new Buffer();
for (int i = 0; i < 10; i  )
{
    buffer[i] = i;
}

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

区别在于编译器可以利用有关内联数组的已知信息。

你可能会像使用任何其他数组一样使用内联数组。有关如何声明内联数组的详细信息,请参阅官网struct类型的语言参考。

结语

本文介绍了C#12的几种新功能,大家觉得实用吗?欢迎留言讨论。

代码语言:javascript复制
推荐阅读:
.NET 8 正式发布有那些新功能?
【.NET8】nativeAOT初体验——杜绝反编译神器
基于C# Socket实现的简单的Redis客户端
C#设计中的6大遗憾
.NET快速对接极光消息推送
.NET 8正式发布点击下方卡片关注DotNet NB一起交流学习▲ 点击上方卡片关注DotNet NB,一起交流学习

0 人点赞