C# 11 即将到来!5 个让你惊叹的功能
微软最近向全球发布了 C# 10 和 .NET 6,但这远不止于此!.NET 团队已经开始着手开发C# 11和 .NET 7中的新功能。在本文中,我们将了解一些即将推出的C# 11 功能,这些功能将彻底改变您的编程方式!
插值链中的“洞”
为了介绍 C# 11 将带来的这一新功能,我们必须记住 C# 目前支持两种类型的插值字符串:
- 逐字插入:
$@""
- 非逐字插入:
$""
这里的主要区别在于逐字插值字符串可以在其文本段中包含新的代码行,并且只能转义适当的引号" "
。
这在非逐字插值字符串中不会发生;在这些情况下,/r/n
使用转义字符(例如)。
当我提到“洞”时,我 和微软指 的是插值表达式。
所有这些都影响了(并且仍然影响着)非逐字插值字符串中的所有“空洞”。由于这些空洞并非真正的文本,因此它们不应该受到转义规则的影响。
让我们看一下微软的示例,说明使用 C# 11 可以做什么,而现在使用 C# 10 则无法做到,因为会出现错误:
var v = $"Count ist: { this.Is.Really.Something()
.That.I.Should(
be + able)[
to.Wrap()] }.";
列出模式
这里还有另一个新功能:新的列表模式。它允许我们在 C#11 中比较数组和列表,能够匹配不同的元素,甚至包含匹配零个或多个元素的剪切模式。
正如凯瑟琳 (Kathleen)告诉我们的那样,切片模式可以遵循例如另一个列表模式(例如var
模式),以捕获切片的内容。
我们来看看微软的例子:
该模式
[1, 2, .., 10]
匹配以下所有内容:
int[] arr1 = { 1, 2, 10 };
int[] arr1 = { 1, 2, 5, 10 };
int[] arr1 = { 1, 2, 5, 6, 7, 8, 9, 10 };
要探索列表模式,请考虑:
public static int CheckSwitch(int[] values)
=> values switch
{
[1, 2, .., 10] => 1,
[1, 2] => 2,
[1, _] => 3,
[1, ..] => 4,
[..] => 50
};
您可以在早期预览 C# 11 功能中更深入地查看该示例。
参数空检查
正如我们所知,这个新功能基于通常使用样板代码的变体来验证方法参数是否为空,例如:
public static void M(string s)
{
if (s is null)
{
throw new ArgumentNullException(nameof(s));
}
// Body of the method
}
现在我们可以简化检查空参数的意图 !!
:
public static void M(string s!!)
{
// Body of the method
}
这也可以用于检查索引器参数get
:set
public string this[string key!!] { get { ... } set { ... } }
构造函数
此功能有一些小变化。如果在任何时候使用 !!
空值验证语法执行显式空值检查更改,则该验证将在字段初始化器之后进行。在执行任何这些操作之前,将使用参数空值检查语法进行空值检查。
与可空引用类型的交互
!!
如果我们将之前见过的运算符应用于参数名称 ,它将以非空状态开始,并具有可空状态。让我们检查一下微软的示例:
void WarnCase<T>(
string? name!!, // CS8995 Nullable type 'string?' is null-checked and will throw if null.
T value1!! // Okay
)
!!
我们可以看到,当参数语法与参数上的显式可空类型一起使用时,编译器会发出警告 。
C# 11 结论
由于仅在几个月前(去年 11 月),微软才正式发布了 .NET 6 和 C# 10,我们可以说 C# 11 的新特性和功能很多,其中大多数尚未得到充分利用,我们将不得不等待微软在不久的将来深入讨论它们。
如果您喜欢这篇文章,请不要忘记关注我们,这样您就可以成为第一批阅读 .NET 新功能的人之一。
鏂囩珷鏉ユ簮锛�https://dev.to/bytehide/c-11-is-coming-5-features-that-will-blow-your-mind-3o7h