共计 2653 个字符,预计需要花费 7 分钟才能阅读完成。
C# 11 行将实现。这篇文章涵盖了 Visual Studio 17.3 中的新性能,和咱们在 Visual Studio 17.2 的 4 月更新和 Visual Studio 17.1 的 2 月更新中未涵盖的性能。
此预览版中的新性能遵循 C# 11 的三个投资主题:
-
对象初始化改良:无论您想对可变和不可变成员施行什么规定,您都能够更轻松地反对类型中的构造函数和对象初始值设定项。特点包含:
- Required 成员
ref
字段
-
通用数学反对:您能够为多种数字类型编写一次算法。这些性能应用 C# 和 .NET 进行统计、机器学习和其余数学密集型应用程序变得更加容易。特点包含:
- 接口中的动态形象和动态虚构成员
- 放宽右移要求
- 无符号右移运算符
- 数值
IntPtr]
- 开发人员生产力:咱们增加了更多语言性能以进步您的工作效率。
新的扩大个性:nameof
。
以下局部概述了 Microsoft Docs 中的每个性能和链接,您能够在其中浏览更多信息。要试用这些性能,您须要在您的我的项目中启用预览。文档中的 C# 11 中的新增性能一文对此进行了解释。
对象初始化改良
required 成员容许您编写须要 caller 设置某些属性的类和构造类型。参考这个 Person
类型:
public class Person
{public string FirstName { get; init;}
public string LastName {get; init;}
}
caller 应该应用对象初始值设定项来设置 FirstName
和 LastName
属性的值。但在 Visual Studio 17.3 之前,编译器无奈强制 caller 必须设置这些属性。须要参数的构造函数是确保用户设置 FirstName
和LastName
属性的惟一办法。required 成员需向编译器和 caller 传播他们必须设置这些属性。将 required
修饰符增加到成员申明中:
public class Person
{public required string FirstName { get; init;}
public required string LastName {get; init;}
}
所有 caller 都必须蕴含 FirstName
和 LastName
属性的对象初始值设定项,否则编译器会收回谬误提醒。编译器告诉 caller 有 required 成员未初始化。开发人员必须立刻解决这个问题。
如果 Person
类型是为晚期版本编写的并且蕴含设置属性的构造函数,您依然能够应用 required 成员。您应该应用 SetsRequiredMembers
属性标注任何现有的构造函数:
public class Person
{public required string FirstName { get; init;}
public required string LastName {get; init;}
[SetsRequiredMembers]
public Person(string firstName, string lastName)
{
this.FirstName = firstName;
this.LastName = lastName;
}
public Person() {}
}
SetsRequiredMembers
属性示意构造函数设置所有 required 成员。编译器晓得应用
Person (string firstName, string lastName)
构造函数的调用者曾经设置了 required 成员。无参数构造函数不蕴含该属性,因而应用该构造函数的调用者必须应用对象初始化器初始化所有 required 成员。
下面的示例应用了属性,但您也能够将 required 成员利用于字段申明。
此预览还蕴含 ref 字段和作用域值的初始实现。这些更改为 ref struct
类型中的 ref
字段提供了可用性。您还能够应用 scoped
关键词来限度 ref
参数的生命周期。性能提案和更新的更改当初提供了无关此性能的最佳文档。咱们发现了一些须要更改语言能力平安应用的场景。更新的更改将在一个稍后公布的预览中提供,文档将反映最终设计。
通用数学反对
咱们增加了通用数学作为激励场景的性能。您只会在高级场景中间接应用这些性能,例如编写实用于多种数字类型的数学算法。否则,您将间接受害,因为运行时应用了以下性能:
- 接口中的动态形象和动态虚构成员
- 放宽右移要求
- 无符号右移运算符
- 数字 IntPtr
在接口中增加动态形象和虚构成员为通用数学打下了了许多重要的根底。该性能容许接口申明运算符以及其余静态方法。实现接口的类就像在接口中申明的其余办法一样必须提供 动态形象
办法的实现。编译器在编译时解析对 动态
办法(包含运算符)的调用。没有像实例办法那样的运行时候派机制。该文档提供了无关使此性能失常工作所需的特定语言规定的更多详细信息。
其余语言个性打消了数字类型的一些差别,从而更容易编写通用数学算法。右移运算符不再要求第二个操作数是 int
,而是 任何整数类型都能够!nint
和 nuint
类型别离是 System.IntPtr
和 System.UIntPtr
的同义词。这些关键字能够用来代替这些类型。事实上,新的分析器会提醒您抉择关键字而不是类型名称。最初,当您执行无符号移位时,无符号右移运算符 (>>>
) 防止了强制转换。
综上所述,这些更改和查看运算符等其余更改反对通用数学运行时更改。语言改良意味着运行时团队能够对 .NET 中的所有数字类型进行改良。当您的类型应用运算符或其余静态方法实现合约时,您也能够利用这些性能。
开发人员生产力
nameof
运算符当初能够和办法参数一起应用。该性能容许您在办法的属性申明中应用 nameof
运算符,如下例所示:
[return:NotNullIfNotNull(nameof(url))]
string? GetTopLevelDomainFromFullUrl(string? url)
欢送应用
请下载最新的 Visual Studio 2022 预览版并装置 .NET 7 预览版,您也能够独自装置 .NET 7 最新的预览版。装置后,您能够通过创立或关上 C# 我的项目并将 LangVersion
设置为 Preview
来尝试新的性能。
这个 Visual Studio 预览版让咱们离 C# 11 的残缺功能集更近了一步。咱们在该版本中持续对多个主题进行投资。咱们曾经依据您给咱们的反馈进行了修改。当初是下载预览版试用所有新性能并给咱们提供反馈的好时机。咱们正在关注 C# 11 和 .NET 7 并进行最终的更新。
理解更多 C# 11 中的新增性能,请返回官网文档。