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

作者:微信公众号:【架构师老卢】
3-18 16:24
21

概述:随着 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 的引用类型。使用别名可以通过删除不必要的冗长代码来提高可读性。

using OptionalFloat = float?;  
using User = (string name, int id);  
  
// Aliased types can be used anywhere, including as function parameters  
public void PrintUser(User user) => Console.WriteLine(user.name);

主要构造函数

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

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

内联阵列

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

[System.Runtime.CompilerServices.InlineArray(10)]  
public struct MyInlineArray  
{  
    private int _item;  
}  
  
var myArray = new MyInlineArray();  
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中试用一下:

using System;  
using System.Runtime.CompilerServices;  
  
var myClass = new MyClass();  
myClass.SayHello(); // this prints "Hello from the interceptor!"  
  
public class MyClass  
{  
    public void SayHello()  
    {  
        Console.WriteLine("Hello from MyClass");  
    }  
}  
  
public static class InterceptorClass  
{  
    [InterceptsLocation("Program.cs", line: 8, character: 17)]  
    public static void InterceptorMethod(this MyClass myClass)  
    {  
        Console.WriteLine("Hello from the interceptor!");  
    }  
}

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

相关留言评论
昵称:
邮箱:
阅读排行