zl程序教程

您现在的位置是:首页 >  后端

当前栏目

C# 10 有哪些新变化?

c# 10 哪些 变化
2023-09-27 14:27:53 时间

在这里插入图片描述
C# 10于2021年11 月与Visual Studio 2022和 .NET 6一起发布。它添加了几个新功能,使其更容易使用。以下是一些最有用的附加功能以及它们将如何增强您的工作流程的导览。

文件范围的命名空间
让我们从最简单但可能是最重要的变化之一开始。您现在可以通过namespace关键字的新语法选项将命名空间应用于整个文件。文件中的其余代码将自动命名空间,即使它没有在namespace块内缩进。这与 PHP 中的命名空间声明类似。

在 C# 9 中,您需要此代码来命名类:

namespace Demo {
 
    public class Example {
    }
 
}

在 C# 10 中,您可以使用以下代码:

namespace Demo;
 
public class Example {
}

这通过减少缩进级别为您在编辑器中节省了一些水平空间。如果文件需要包含多个类,您可以将它们全部从第 0 列开始编写——该namespace声明适用于整个文件。

全球使用

一些命名空间在项目中使用非常广泛。但是,您仍然需要使用using语句将它们手动包含在每个文件中。

C# 10 对此进行了更改以支持global using变体。这将使引用的命名空间可跨项目中的所有文件访问。

global using System;

可以将全局使用添加到将包含在您的编译中的任何文件中。它们支持标准using语句的所有功能,包括static关键字和别名=。

采用全局 using 将减少您编写的行数,但它们仍然最好保留给通常引用的命名空间,这些命名空间几乎没有命名冲突的机会。请注意,依赖 aglobal using可能会使您的代码更加不透明,因为新的贡献者可能不会立即意识到如何包含命名空间资源。

全局 using 的一个伴随功能是隐式 using。这会自动创建global using适合您项目类型的语句。该功能在 .NET 6 项目模板中默认开启。它可以与被禁用ImplicitUsings设置你的.csproj文件。

改进的结构

结构体得到了一些增强,使它们与类更接近。其中包括无参数构造函数、字段初始值设定项、对with表达式的完全支持以及创建记录结构的选项:

public record Point(int X, int Y);

此示例创建一个“位置”记录结构,其中X和Y构造函数参数成为隐式公共成员。您还可以使用现有语法手动定义成员:

public record struct Point {
    public int X { get; init; }
    public int Y { get; init; }
}

在需要封装一些数据而不将自定义行为附加为类方法的场景中,应该使用记录结构体。记录结构提供集成的值相等性检查和功能,例如ToString(). 它可以通过readonly关键字可变或不可变。

Lambda 表达式增强

C# 10 对 lambda 表达式进行了多项改进,涵盖了它们的类型和语法。目标是使 lambda 更类似于常规方法和本地函数。定义一个现在将是一种更熟悉的体验。

引入了“自然”类型的概念。这让编译器可以推断 lambda 的类型,而无需手动将其转换为委托或表达式。在将 lambda 赋值给变量时,这会创建更具可读性的代码:

// C# 9
Func<string, int> toInt = (string s) => int.Parse(s);
 
// C# 10
var toInt = (string s) => int.Parse(s)

编译器将推断toIntas的类型,Func<string, int>当您在 Visual Studio 中查看代码时将显示该类型。推理将使用Func、Action或合成委托。

自然类型仅在您的 lambda 表达式已经完全输入时才有效。如果省略参数类型,编译器将无法创建兼容的类型定义。

一个相关的变化是支持显式返回类型。与常规函数一样,返回类型位于 lambda 的参数列表之前:

var toInt = int (string s) => int.Parse(s)

最后,Lambda 现在可以采用与方法和函数相同的方式获取属性。它们位于 lambda 表达式的开头,在返回类型和参数列表之前。您可以使用属性将额外的元数据附加到您的 lambda 表达式,以促进更好的内省和代码分析。

var toInt = [DemoAttribute()] int (string s) => int.Parse(s)

多功能解构赋值

解构赋值现在既可以初始化新变量,又可以为同一行中的现有变量赋值。以前,您需要为这些操作使用单独的解构。
在 C# 9 中,这导致代码如下所示:

int x = 0;
int y = 0;
(x, y) = point;
 
(int z) = point;

而在 C# 10 中,您可以这样做:

int x = 0;
int y = 0;
(x, y, int z) = point;

现在x, y, 和z都将使用单个解构赋值使用值进行初始化,从而减少代码中的重复。

其他变化

字符串插值已得到改进,现在也适用于常量字符串。您需要确保在插值期间用于填充占位符孔的所有字符串本身都是常量值。更广泛地说,对插值过程的优化可以通过使用专用处理程序来减少内存使用并提高性能。

属性模式已被简化,以提供对嵌套属性的更具可读性的访问。您现在可以使用点语法来访问嵌套的属性值,而不是多层括号:

// C# 9
{ Train: {ArrivalTime: "10:00"} }
 
// C# 10
{ Train.ArrivalTime: "10:00" }

在其他地方,编译器优化意味着您将在确定赋值和空状态检查期间从更少的误报中受益。在编译时触发虚假警告的几个 C# 9 问题已得到解决,从而产生更准确的检查,更好地帮助您调试真正重要的问题。这些问题与使用空合并表达式和对布尔常量的变量比较有关。

结论

C# 10 添加了几项新功能,这将有助于使开发更加简单明了。但是,包括field关键字和必需属性在内的许多其他新功能已被推迟到下一个主要版本。接口的通用属性和静态抽象成员使其成为 10 个,但仍附加了预览标记。
您可以立即通过下载Visual Studio 2022开始使用 C# 10 。该语言也可作为独立的.NET 6 SDK 的一部分使用,可在 Windows、Mac 和 Linux 上运行。