[翻译]欢迎来到 C# 7.1
[翻译]欢迎来到 C# 7.1
在 C# 中,我们一直倾向于主要版本:捆绑了很多功能,并且不太频繁地发布。当我们谈到 C#6.0时,我们甚至还经常忽略掉后面的“.0”!
在 C#7.0 这一“波”中,我们正在尝试新的东西。像 Visual Studio 这样频繁的升级节奏,为什么 C# 不能也频繁的升级呢,这已经不存在技术原因了。所以这一次,我们正在拥抱“点发布”的概念; C#的次要版本会以更短的间隔更新,并且提供有用且较小的语言功能。这意味着您不必等待很长时间才能获得高级特性,而且还可以更容易地将C#版本与相关功能的发布相一致,例如.NET。
当然,对于团队来说,将语言升级到新版本“一直以来”都是件麻烦事,对于个人来说还好。 Visual Studio 2017 允许您决定是否切换到最新版本,或使用主要的版本。你可以选择你的喜好。
第一个“点发布”
在2017年8月,我们发布了 C# 的第一个“点发布”版。它被称为 C#7.1,其主要目的是为我们的“点发布”积累经验,并且保证没有太多的依赖以使问题复杂化。
因此,C#7.1是一个很小的版本,只有少数(但精心挑选的)新语言特性; 我们认为它们是有用的,并且一定在某些场景下有用。 Visual Studio 2017 Update 15.3 开始支持。
现在我们来看一下!这是一个涵盖了三个 C#7.1 新特性的程序,加上最近 C#7.0 的一些特性,旨在使其有趣。
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using static System.Console;
class Program
{
static async Task Main(string[] args)
{
var results = Enumerable.Range(1, 40)
.Select(input => (input, task: FibonacciAsync(input)))
.ToArray();
foreach (var tuple in results)
{
WriteLine($"Fib {tuple.input} = {await tuple.task}");
}
}
private static Task<int> FibonacciAsync(int n, CancellationToken token = default)
{
return Task.Run(() => Fib(n).curr, token);
(int curr, int prev) Fib(int i)
{
if (i is 0) return (1, 0);
var (c, p) = Fib(i - 1);
return (c + p, c);
}
}
}
它在线程池中并行计算前40个斐波纳契数,并按顺序打印出来。
我们来看看这里使用的每个新的 C#7.1 特性。要全面的了解 C#7.1 中新特性,请查看文档。
Main 方法可以 Async
现在 Main 入口点方法可以返回 Task 或 Task。当它执行时,执行将等待返回的任务完成,然后关闭程序。
当然,常用的方法就是使 Main 方法异步,你可以这样做:
static async Task Main(string[] args)
这会让你可以直接在 Main 方法里 await, 这在以前是不行的。
WriteLine($"Fib {tuple.input} = {await tuple.task}");
以前的话,想达到这个效果是很麻烦:首先创建一个 async 的辅助方法,MainAsync,写上所有逻辑,然后写个怪异的 Main 方法:
static void Main(string[] args) => MainAsync().GetAwaiter().GetResult();
现在你可以直接让你的 Main 方法 async,编译器会帮你重写它。
推断元组元素的名称
在这个lambda表达式里面的查询:
input => (input, task: FibonacciAsync(input))
您注意到,我们创建一个元组,但只为第二个元素提供一个名称, task。然后我们可以直接这么写
WriteLine($"Fib {tuple.input} = {await tuple.task}");
用名称tuple.input来访问第一个元素。这是因为当您创建一个有名称的表达式元组时,如上面的lambda表达式中的输入,我们将自动给予相应的元组元素一个名称。
Default literals 默认常值
如果默认表达式有预期类型,那么现在可以省略对类型的说明,就像在 FibonacciAsync 方法的签名中的 CancellationToken 一样:
private static Task<int> FibonacciAsync(int n, CancellationToken token = default)
这避免了繁琐的类型名称重复,或者当已经由上下文给出时,输出长的类型名称。
What’s next?
我们已经在开发 C#7.2,以及下一个主要版本的特性。 如果你好奇,你可以跟随并参加C#语言设计GitHub repo:github.com/dotnet/csharplang
[翻译]欢迎来到 C# 7.1的更多相关文章
- 欢迎来到 C# 9.0(Welcome to C# 9.0)【纯手工翻译】
翻译自 Mads Torgersen 2020年5月20日的博文<Welcome to C# 9.0>,Mads Torgersen 是微软 C# 语言的首席设计师,也是微软 .NET 团 ...
- 《Entity Framework 6 Recipes》中文翻译系列 (8) -----第二章 实体数据建模基础之继承关系映射TPT
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 2-8 Table per Type Inheritance 建模 问题 你有这样一 ...
- Ansible-Tower快速入门-2.准备开始【翻译】
准备开始 欢迎来到ansible tower! 首先,您可以按照下面的快速安装说明进行安装,详细的安装说明可以查看章节标题“安装和设置指南”,然后,你可以通过快速启动来快速开启和运行tower,或者设 ...
- GitHub官方介绍(中文翻译)
注:本人亲自翻译,转载请注明出处. 官方链接地址 http://guides.github.com/activities/hello-world/ Hello World 项目在计算机编程界是一项历史 ...
- Apple的App Analytics统计平台你必须知道的Q&A整理与翻译
Apple的App Analytics统计平台你必须知道的Q&A整理与翻译 Apple最近在iTunesConnect里最新发布了App Analytics统计平台,提供了现有友盟统计平台和自 ...
- [翻译]了解ASP.NET底层架构(八)
原文地址:http://www.cnblogs.com/tmfc/archive/2006/09/04/493304.html [翻译]了解ASP.NET底层架构(完) [翻译]了解ASP.NET底层 ...
- 【翻译习作】 Windows Workflow Foundation程序开发-第一章01
第 1 章 欢迎来到工作流的世界 …思想如蝴蝶般飞到我身边 —— Gossard / Vedder (译注:Gossard与Vedder是来自Pearl Jam乐队的2名乐手,该句出自他们的歌曲 ...
- 卸载 Cloudera Manager 5.1.x.和 相关软件【官网翻译】
问题导读: 1.不同的安装方式,卸载方法存在什么区别?2.不同的操作系统,卸载 Cloudera Manager Server and 数据库有什么区别? 重新安装不完整如果你来到这里,因为你的安装没 ...
- 《Programming WPF》翻译 第6章 4.应用程序全球化
原文:<Programming WPF>翻译 第6章 4.应用程序全球化 如果你打算发布你的应用程序到全球各地,你可能需要为不同地区的用户界面准备不同的版本.至少,这需要解决将文本翻译成适 ...
随机推荐
- JDBC数据库之添加数据
通过JDBC向数据库中添加数据,可以使用INSERT语句实现插入数据SQL语句,对于SQL语句中的参数可以只用占位符"?"代替,然后通过PreparedStatement对其赋值以 ...
- [js学习笔记] 原型链理解
js中只有对象,包括对象,函数,常量等. prototype 只有函数里有这个属性. 对象里可以设置这个属性,但是没这个属性的意义 prototype指向一个对象,可以添加想要的方法. 该对象里有一个 ...
- 为ASP.NetCore程序启用SSL
紧接着上一篇搭建连接MySql的三层架构的ASP.NetCore2.0的WebApi的案例,这篇来实现为ASP.NetCore启用SSL支持 由于ASP.NetCore默认服务器Kestrel不像ii ...
- TomCat系统架构
1.TomCat总体结构 TomCat有两大核心组件:Connector和Container.Connector组件是可以被替换的,一个Container可以对应多个Connector. 多个Conn ...
- Linux入门之常用命令(2)
(三) 链接文件 ln [-s] [源文件] [目标文件] -s表示符号链接 没有则是硬链接 硬链接是一个独立文件 (相当于一个副本) 符号链接是一个链接文件(相当于一个快捷方式) 但是修 ...
- php中常用的字符串大小写转换函数实例解释
PHP字符串处理函数中,最为简单的几个函数,相关解释就不上了,直接看例子. PHP字符串处理函数中,最为简单的几个函数,相关解释就不上了,直接看例子. strtolower函数.strtoupper函 ...
- HDU2048 HDU2049 组合数系列 错排
HDU1465HDU2048HDU2049#include<cstdio> #include<cstdlib> #include<iostream> #includ ...
- mysql导出数据库和恢复数据库代码
mysql导出数据库和备份数据库 用mysqldump 命令行 命令格式 mysqldump -u 用户名 -p 数据库名 > 数据库名.sql 范例: mysqldump -uroot -p ...
- 关于Struts与Ajax整合时的异常处理
关于Struts与Ajax整合时的异常处理问题: 问题还原: 从而当有异常发出时,会将异常信息发送到页面上.如下图所示:这是一个比较经典的过程: 错误提示页面: 由于sendError()方法里 ...
- C#线程池多线程Socket通讯 服务器端和客户端示例
using System; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; ...