作者 | Matthew MacDonald

译者 | 弯月     责编 | 欧阳姝黎

出品 | CSDN(ID:CSDNnews)

以下为译文:

C# 的 GitHub 页面上记载了一长串诱人的想法,其中一些令人头疼的问题仍在讨论中。如果你想知道C# 10中究竟包含了哪些新功能,可以等待11 月新版本的发布。或者,你也可以关注 C# 团队展示的他们最喜欢的功能。在最近的微软Build 大会上,C# 的首席设计师 Mads Torgersen 透漏了一些目前正在进行的工作。以下是该语言的下一个版本将会提供的五大新功能。

global using

C# 的源代码文件开头一般都会导入一堆命名空间。下面是一个普通的ASP.NET Web 应用程序的代码片段:

using LoggingTestApp.Data;
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 Serilog;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace LoggingTestApp
{
public class Startup{...}
}

这段代码的写法没有什么特别之处。以前,命名空间的导入可以让我们快速了解某个类正在使用哪些库。然而如今,这只不过是一堆不得不写又没人去看的代码了。

C# 10 引入了一种新模式,允许你使用关键字 global 定义整个项目的命名空间导入。推荐做法是,将全局导入放在一个单独的文件中(每个项目一个),可以命名为 usings.cs 或imports.cs。其中的内容大致为:

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;

然后就可以简化原来的文件了:

using LoggingTestApp.Data;
using Serilog;
namespace LoggingTestApp
{
public class Startup{...}
}

Visual Studio会突出显示重复的命名空间(即同时在全局文件和本地文件中导入的命名空间)。尽管这不是错误,但删除重复的命名空间可以减少代码量,并将注意力集中在特定文件正在使用的特殊命名空间上。

文件范围的命名空间

C# 10 提供了另一种简化代码的方法:声明文件范围的命名空间。文件范围的命名空间会自动应用于整个文件,而且无需缩进。

换句话说,下面这种写法:

namespace LoggingTestApp
{
public class Startup{...}
}

可以变成:

namespace LoggingTestApp;
public class Startup
{...
}

如果在使用了文件范围命名空间的文件中,再添加一个命名空间块,则会创建一个嵌套命名空间:

namespace Company.Product;
// This block creates the namespace Company.Product.Component
namespace Component
{
}

C# 设计者认为这个改动可以清理水平空间的浪费(就像global using清理了垂直空间的浪费一样)。总体目标是让代码更短、更窄、更简洁。但这些变化也可以降低新手学习C#的难度。结合global using与文件范围的命名空间,只需几行代码就可以创建出一个Hello World 控制台应用程序。

空参数检查

本着减少样板代码的精神,C# 提供了一个非常好的新功能:空参数检查。你肯定编写过需要检查空值的方法。比如,如下代码:

public UpdateAddress(int personId, Address newAddress)
{
if (newAddress == null){
throw new ArgumentNullException("newAddress");}...
}

如今,你只需要在参数名称末尾添加“!!”,C#就会自动加入这种空参数检查。上述代码可以简化为:

public UpdateAddress(int personId, Address newAddress!!)
{...
}

现在,如果传递一个空值给 Address,就会自动抛出 ArgumentNullException。

这种细节可能看似微不足道,但实际上这是非常简单又很有价值的优化语言的方式。大量研究表明,导致程序出错的原因往往是由于非常容易避免的错误反复发生,不是因为代码中的概念太复杂,而是因为阅读代码很累,而人类的注意力有限。减少代码量可以减少审查代码所需的时间,处理代码所需的认知负荷,以及由于注意力减弱而忽略某些错误的可能性。

required 属性

以前,我们只能通过类构造函数来确保正确地创建对象。如今,我们经常使用更加轻量级的结构,比如下面这个记录中自动实现的属性:

public record Employee
{public string Name { get; init; }public decimal YearlySalary { get; init; }public DateTime HiredDate{ get; init; }
}

在创建这类轻量级对象的实例时,我们可能会使用对象的初始化语法:

var theNewGuy = new Employee
{Name = "Dave Bowman",YearlySalary = 100000m,HiredDate = DateTime.Now()
};

但是,如果你的对象中的某些属性是必须的,该怎么办?你可以像以前一样,添加一个构造函数,但如此一来就需要添加更多的样板代码了。此外,将值从一个参数复制到属性也是另一个很容易理解但很常见的错误。

C# 10 引入的关键字 required 可以消灭这类问题:

public record Employee
{public required string Name { get; init; }public decimal YearlySalary { get; init; }public DateTime HiredDate{ get; init; }
}

如此一来,如果不设置 Name 属性就无法创建 Employee 了。

关键字field

多年来,为了通过自动实现属性简化代码,C# 团队做出了大量努力,上面的 Employee 记录就是一个很好的例子,它使用 get 和 init 关键字声明了三个不可变的属性。数据存储在三个私有字段中,但这些字段都是自动创建的,无需人工干预。而且你永远不会看到这些字段。

自动实现的属性很棒,但它们的作用也仅限于此。当无法使用自动实现的属性时,你就必须添加支持字段到类,并编写正常的属性方法,就像回到 C# 2一样。但是 C# 10中提供了一个关键字field,可以自动创建支持字段。

例如,假设你想创建一个记录,用于处理初始属性值。在下面的代码中,我们对 Employee 类进行了一些修改,确保HiredDate 字段只包含来自 DateTime 对象的日期信息(不包含时间信息):

public record Employee
{public required string Name { get; init; }public decimal YearlySalary { get; init; }public DateTime HiredDate{ get; init => field = value.Date(); }
}

这段代码非常整洁、简单,而且很接近声明式。

你可以使用关键字 field 访问 get、set 或 init 中的字段。而且,你可能需要验证某个属性,就像验证普通类中的属性一样:

private string _firstName;
public string FirstName
{get{return _firstName;}set{if (value.Trim() == "")throw new ArgumentException("No blank strings");_firstName = value;}
}

你可以使用 field 来验证自动实现的属性:

public string FirstName {get;set{if (value.Trim() == "")throw new ArgumentException("No blank strings");field = value;}
}

本质上,只要不需要修改属性的数据类型,就不需要自行声明支持字段。

总结

当然,C# 10中的新功能肯定不止这个五个。还有一些表达式方面的变化,以及一个有争议的变动:在接口中定义静态成员。我们只有耐心等待了。

总体来看,C# 10 的发展重点很明确,即减少代码量,提供更多便利性,减轻开发人员的负担。

原文链接:https://medium.com/young-coder/a-closer-look-at-5-new-features-in-c-10-f99738b0158e

声明:本文由CSDN翻译,转载请注明来源。

☞
☞因一个 Bug,谷歌、GitHub、亚马逊等网站全球大范围宕机!
☞减少 JavaScript 代码量的原生技术
☞苹果造车欲用中国电池,前提是在美国建厂?比亚迪、宁德时代正与其谈判

C# 10 的五大新功能相关推荐

  1. Windows 10 Version 2004 新功能盘点

    Windows 10 Version 2004 新功能盘点 Windows 10 Version 2004功能更新即将登场,但目前仍没有敲定具体的名称.目前微软已经发布了ISO镜像,意味着微软有望近期 ...

  2. indesign2020突然闪退_Photoshop 2020 五大新功能展示PS及闪退的处理方法

    据悉2020版本已经在路上了,我们最希望 Ps CC 2020版本新增或完善的是哪些功能呢 其它的不先说.我们大家一起先来说说安装教程: Photoshop 2020软件包与安装教程 1. 下载解压安 ...

  3. Windows 10强推新功能:能否让你的电脑更快

    Windows Defender提高你得电脑性能 电脑卡慢常常是电脑爱好者最头痛的问题,无论是做工作还是玩游戏,一个卡机就会让人走向崩溃的边缘.笔记本卡慢的原因有很多,但操作系统都绝对是电脑卡慢不可跳 ...

  4. 您应该知道的ES2020中的10个JavaScript新功能

    Good news – the new ES2020 features are now finalised! This means we now have a complete idea of the ...

  5. Windows 10 20H1 2004新功能

    Windows 10的年度更新版本20H1即将问世. 目前可以从insider preview渠道中获得.这个版本中看上去对搜索功能做了不小的改进.包括搜索的磁盘占用率以及搜索的一些展示方式. 其它的 ...

  6. red flag linux是应用软件吗,RedFlag Desktop Linux 10(红旗Linux 10)的新功能/特性介绍...

    本文将向你介绍RedFlag Desktop Linux 10(红旗Linux 10)的新功能及新特性,让你对RedFlag的桌面版创新有一个了解,以下介绍6点和其他Linux发行版有着与众不同的地方 ...

  7. Android Q(10.0)的新功能和API

    Android Q功能和API 目录: 安全性增强 改进的生物识别认证对话框 直接从APK运行嵌入式DEX代码 TLS 1.3支持 Public Conscrypt API 连接功能 Wi-Fi网络连 ...

  8. iOS 10的iMessage新功能你都玩过了吗?炫酷技能大揭秘

    iOS  10系统到现在已经有一段时间了,当初为了体验iMessage的新功能,手贱去更新了系统,没想到苹果这么不要脸,这么快就关闭验证了,真是装逼装的猝不及防.不过用用也就习惯了,就是这电量怎么跟大 ...

  9. Android10有哪些功能,如何尝试Android 10的五大最佳功能

    你安装了Android10了吗?如果是这样的话,你可能会有点困惑,因为它看起来和工作很像去年的版本,Android9Pie.但它实际上包含了一些大的变化. 还有:Android10:发布日期.功能等 ...

最新文章

  1. 警告:使用隔离见证可能会丢失你的比特币
  2. 使用C#调用Python脚本,带参数列表
  3. prometheus监控耗时MySQL_Grafana+Prometheus监控mysql性能
  4. bootloader学习笔记
  5. 如何在 C# 循环中捕获局部变量?
  6. CVPR 2019 | 微软亚洲研究院 7 篇精选论文解读
  7. library not found for -lstdc++.6.0.9
  8. [公告]决定博客园杂志所采用的标题
  9. 40. MySQL的权限与安全
  10. Javascript:获取点击的li标签内部文字
  11. 智头条:萤石拟科创板上市将投18.5亿建厂,Matter智能家居标准延迟至明年,涂鸦、公牛、极米等企业发布
  12. 分数阶微积分学薛定宇电子版_分数阶微积分学与分数阶控制 pdf epub mobi txt 下载...
  13. 微软的teredo服务器,深度完美W10系统通过teredo连接IPv6的方法
  14. ZooZ应用内移动支付解决方案公司获150万美金种子投资
  15. 索尼sw2刷android wear,索尼SW2改进不错 体验很舒适_索尼 SmartWatch SW2_GPS评测-中关村在线...
  16. 系统架构设计师(截图+做题思路+目录)
  17. tensorflow学习笔记(二十六):构建TF代码
  18. Java的基本特性和优势
  19. 【android逆向笔记】(一)简单登录逆向
  20. 第22讲 记忆元件与时序电路分析

热门文章

  1. 树莓派教程 - 2.2 树莓派CSI摄像头,raspivid、raspistill常用参数
  2. Jenkins构建步骤图解
  3. java 传址或传值
  4. sBRDF空间双向反射分布函数完全解析
  5. [数据]matplotlib总结
  6. Sencha Cmd 6 和 Ext JS 6 指南文档(部分官方文档中文翻译)
  7. HDU-2067-小兔的棋盘
  8. Windows Phone 7 优秀开源项目概览 来源:http://www.cnblogs.com/porscheyin/archive/2010/12/15/1906476.html...
  9. 生成缩略图代码(转帖)
  10. 在Kibana上查看Apache日志