C# 10 - 新版C#中的5大功能介绍

136 阅读5分钟

C#已经存在了一段时间了。更准确地说,是自2002年1月以来。在我们等待这种流行的编程语言的20岁生日时,我们也得到了它的新版本。C# 10将于9日发布。如果你关注它的 GitHub页面,你可以发现很多关于该语言新版本的功能和想法。

这可能有点让人不知所措,不过,如果你关注微软的会议,听听一些C#设计者的意见,并与Github页面上的建议交叉检查,你就可以很好地了解C#的下一步发展。例如,你可以看看5月份的这个微软Build会议,你可以发现很多的 有趣的信息.

1.空值参数检查

空值参考异常是你的代码中可能出现的最糟糕的错误之一。它是非常痛苦的。为了防止这种类型的异常,你需要对应用程序进行防弹设计,并对函数的参数进行大量检查。这个新特性应该可以帮助我们做到这一点,并使我们的代码更加可读和健壮。

Recommendation Systems

1.1 目前的问题

目前,如果你想检查你的函数的某个参数是否为空,你将不得不做这样的事情。

public SomeFunction(int id, SomeClass newObject)
{
  if (newObject == null)
  {
    throw new ArgumentNullException("newObject");
  }
  ...
}

在上面的代码中,我们将SomeClassnewObject注入到SomeFunction中。如果提到的对象是空的,我们就不应该继续执行这段代码。我知道很多人会说,如果有正确的应用设计,这个问题首先就不应该存在,然而,有时必须这样做。

1.2 C# 10的特点

新版本的 C# 旨在为我们简化这个问题,它有--。你所要做的就是在参数的名称后面添加两个感叹号。

public SomeFunction(int id, SomeClass newObject!!)
{
	...
}

在这个例子中,代码会自动检查newObject是否为空。如果newObject的值为ArgumentNullException将被自动抛出。

2.扩展属性模式

有时,我们需要在代码中嵌套属性。意思是一个属性的属性。在这些值上使用模式匹配,在以前的C#版本中也是可行的,但代码有点难看。

Programming

2.1 目前的问题

这是C#9中switch的代码,看起来是这样的:

if (e is MethodCallExpression { Method: { Name: "MethodName" } })

呸,有点怪异。在模式匹配中使用点会 更容易。

2.2 C# 10的特点

C#10引入了完全必要的改进。与其重复几次括号,现在上面的代码更直观了。

if (e is MethodCallExpression { Method.Name: "MethodName" })

3.记录结构

类的Record关键字是在C#9中首次引入的。这个关键字用于为封装数据提供内置功能的 引用类型 。记录主要是为了支持不可变的数据模型。

Computer

3.1 目前的问题

在以前的C#版本中,这个关键词是为类保留的。

public record Person(string FirstName, string LastName);

3.2 C# 10的特点

在C#10中,记录又向前迈进了一步。现在,你也可以使用结构类型 来设计以数据为中心的类型,这些类型提供了价值平等和很少或没有行为。在C#10及以后的版本中,你可以定义 record struct类型。

public readonly record struct Point(double X, double Y, double Z);

4.全局使用

这是一个新的功能,将大大简化代码。正如你所知道的,每个C#文件开始都有一个实现所需的使用列表。然而,有时这也是多余的。特别是当你在使用ASP.NET时,很多代码都是重复的,总的来说对编码者来说只是一种噪音。

Computer

4.1 目前的问题

如果我们以一个ASP.NET文件为例,使用的列表是巨大的。

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.HttpsPolicy;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Identity.UI;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

4.2 C# 10的特点

C# 10引入的另一个关键词是global。使用global,你将能够为整个项目定义全局使用。一般来说,建议创建一个单独的文件来包含这些导入,比如usings.cs

这意味着项目中的其他文件可以被简化,因为它们不再需要添加所有这些使用方法。C# 设计者将此称为消除垂直浪费:

global using Microsoft.AspNetCore.Builder;
global using Microsoft.AspNetCore.Hosting;
global using Microsoft.AspNetCore.HttpsPolicy;
global using Microsoft.AspNetCore.Identity;
global using Microsoft.AspNetCore.Identity.UI;
global using Microsoft.EntityFrameworkCore;
global using Microsoft.Extensions.Configuration;
global using Microsoft.Extensions.DependencyInjection;
global using Microsoft.Extensions.Hosting;
global using System;
global using System.Collections.Generic;
global using System.Linq;
global using System.Threading.Tasks;

5.文件命名空间

使用全局关键字,C#消除了垂直浪费,而用文件命名空间则消除了水平浪费。基本上,这个功能的目的是解决缩进问题,它更像是一个外观上的改变,希望能让你的代码更干净。

Partial

5.1 目前的问题

现在,在使用列表之后,你在 C# 文件中看到的第一件事就是命名空间的定义。之后是类的定义。类的实现在这时已经缩进了。这就是我们所认为的横向浪费。

namespace Blog
{
  public class Article
  {
    ...
  }
}

5.2 C# 10特性

有了这个特性,你可以像这样在文件层面上定义命名空间。

namespace Blog;

public class Article
{
  ...
}

结语

在这篇文章中,我们有机会熟悉了C#新版本将带来的5个新特性。说实话,我已经迫不及待地想把它们都试出来了。其中一些看起来是重大改进,而且似乎会影响我们组织和编写C# 项目的方式。

谢谢您的阅读!