C# 8.0 新特性介绍
C# 语言是在 2000 年发布的,至今已正式发布了 7 个版本,每个版本都包含了许多令人兴奋的新特性和功能更新。C# 语言的发展与同时期的 Visual Studio 以及 .NET 运行时版本高度耦合,这也有助于开发者更好的学习掌握 C#,并将其与 Visual Studio 以及 .NET 的使用结合起来。
C# 8.0 版本中三个令人兴奋的新特性:
1. 非空和可空的引用类型
在 C# 8.0 中,将引用类型设为非空,成了一个可选的特性。为 C# 引入这样的特性是很困难的,因为这为原本已经运行很好的代码,引入了潜在的编译错误。因此需要做的是,创建此功能的方法,而不是为开发人员带来无法估量的工作量。根据设计方案,C# 团队决定采取一个允许开发者可以选择可空引用类型的方法。这将是一个工程级别的设定,以便启用对可空引用的验证。
例如:
```csharp
String s = null;
Console.Write(s);
```
这将引起警告,因为字符串不能接受空值。因此需要以下代码:
```csharp
String? s = null;
Console.Write(s);
```
然而,上面代码也会在 Console 抛出一个警告,写的是不希望收到一个空字符串。事实上,原始代码可能有错误,所以级联警告可以帮助我们避免运行时错误。这是最有可能提高代码质量的语言变化。
2. 新的轻量级类:Records
C# 8.0 的一个很棒的新特性,是有一种新方式来创建一个被称为 records 的类。这个类本质上是一个非常轻量级的类,是一个字段集合,能够帮助快速创建 POCO 类型的对象,同时也可以解决比较对象是否相等时的关键问题。
例如,为银行帐户创建 record 类型:
```csharp
class BankAccount(Guid Id, string Name, decimal Balance)
```
这是一种创建简单类的很好的方法。用用 records 解决对象相等问题解决对象相等问题在 C# 编程中,一个最难掌握的内容就是,将 == 运算符用于引用类型和原语之间的区别。
例如,我们使用 == 对比两个整数:
```csharp
int I = 1;
int j = 1;
i == j // yields true
```
原语的值是相等的。但是,对于引用类型,却不相等。
```csharp
Object I = new Object();
Object j = new Object();
i == j // yields false
```
这是因为 C# 的引用类型比较会考虑引用相等,也就是说,只有当两个对象是同一个对象才相等。records 类型提供了结构上的相等,等同于相等运算符。
3. 可 null 的引用类型和 tuples(元组)
C# 8.0 中的另一个新特性是可 null 的引用类型和 tuples。这允许开发者能够更好地控制引用类型的可 null 性,并且可以使用 tuples 来简化代码。
例如:
```csharp
(string, int) LookupName(int id)
{
return (id == 1 ? "John" : null, id);
}
```
这将返回一个 tuples,包含一个字符串和一个整数。
C# 8.0 版本中的新特性将有助于开发者更好地使用 C# 语言,提高代码质量和开发效率。