当前位置: 欣欣网 > 码农

C# 12 中的新功能介绍(带示例)

2024-04-19码农


概述: 随着 C# 12 的即将发布,以下是新功能的编译列表,以及如何使用它们的实际示例。Lambda 表达式中的默认参数这是一个简单的更改。这在之前使用 DefaultParameterValue 是可能的,但新的实现要简洁得多。var myMethod = (int a, int b = 1) = a + b; var myVar = myMethod(5); // this returns 6别名 带有「using」别名指令的任何类型通过使用「using」alias 指令,您现在可以为几乎任何类型添加别名,包括可为 null 的值类型。不支持可为 null 的引用类型。使用别名可以通过删除不必

随着 C# 12 的即将发布,以下是新功能的编译列表,以及如何使用它们的实际示例。

Lambda 表达式中的默认参数

这是一个简单的更改。这在之前使用 DefaultParameterValue 是可能的,但新的实现要简洁得多。

var myMethod = (int a, int b = 1) => a + b;
var myVar = myMethod(5); // this returns 6

别名 带有「using」别名指令的任何类型

通过使用「using」alias 指令,您现在可以为几乎任何类型添加别名,包括可为 null 的值类型。不支持可为 null 的引用类型。使用别名可以通过删除不必要的冗长代码来提高可读性。

usingOptionalFloat = float?;
usingUser = (string name,int id);
// Aliased types can be used anywhere, including as function parameters
publicvoidPrintUser(User user) => Console.WriteLine(user.name);

主要构造函数

C# 12 最初是在 C# 9 中针对记录类型引入的,现在将此功能扩展到所有类和结构。这样做的目的是允许我们向类声明中添加参数,以便在您的类中使用,以简洁起见。

public classPost(string title, int upvotes, int downVotes)
{
publicstring Title => string.IsNullOrWhiteSpace(title) ? "" : title.Trim();
publicint Score => upVotes - downVotes;
}

内联阵列

内联数组使开发人员能够为结构类型创建固定大小的数组。这些将主要由运行时团队和库创建者用作提高性能的一种方式。正如 Microsoft 的文档中所述,您可能不会显式创建它们,但会透明地使用它们。如果您好奇,此功能的草稿中有冗长的解释。

[System.Runtime.CompilerServices.InlineArray(10)]
publicstructMyInlineArray
{
privateint _item;
}
var myArray = newMyInlineArray();
for (int i = 0; i < 10; i++)
{
myArray[i] = i;
}
foreach (var i in myArray)
{
Console.WriteLine(i);
}

集合表达式

集合表达式为您提供了创建公共集合的新语法。现在,您还可以使用内联的扩展运算符「..」来传播一个集合与另一个集合的值。请参阅以下示例:

int[] a = [1, 2];
int[] b = [3, 4];
int[] c = [..a, ..b];
foreach (var i in c)
{
Console.WriteLine(i);
}
// produces 1, 2, 3, 4

拦截 器

对于高级程序员来说,拦截器是一个有趣的新功能,目前被标记为实验性功能,可能不会进入最终版本。_侦听器_是一种可以在编译时用自身替换_可拦截_方法的方法。若要启用此功能,由于它仍处于实验阶段,因此必须将以下行添加到项目文件中:

<Features>InterceptorsPreview</Features>

现在我们已经启用了该功能,让我们在Program.cs中试用一下:

usingSystem;
usingSystem.Runtime.CompilerServices;
var my class = newMy class();
my class.SayHello(); // this prints "Hello from the interceptor!"
public classMy class
{
publicvoidSayHello()
{
Console.WriteLine("Hello from My class");
}
}
publicstatic classInterceptor class
{
[InterceptsLocation("Program.cs", line: 8, character: 17)]
publicstaticvoidInterceptorMethod(thisMy class my class)
{
Console.WriteLine("Hello from the interceptor!");
}
}

我们这里有一个名为 My class 的基本类,它有一个名为 SayHello 的方法,它只打印字符串「Hello from My class」。然后下面我们有 Interceptor class,其中有 InterceptorMethod。请注意它上面的「InterceptsLocation」属性 — 这是您希望此方法截获另一个方法的文件、行和字符的位置。在本例中,我们已将文件Program.cs以及 SayHello 方法所在的行和字符放在一起,并告诉编译器将该方法替换为此新方法。

如果你喜欢我的文章,请给我一个赞!谢谢