[翻译]欢迎来到 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.应用程序全球化 如果你打算发布你的应用程序到全球各地,你可能需要为不同地区的用户界面准备不同的版本.至少,这需要解决将文本翻译成适 ...
随机推荐
- Spring在JSP页面使用ServletContext
在 JSP 页面使用Application 可以 看到使用的是WebApplicationContextUtils 而不是WebApplicationContext.ROOT_WEB_APPLICAT ...
- day16<集合框架+>
集合框架(去除ArrayList中重复字符串元素方式) 集合框架(去除ArrayList中重复自定义对象元素) 集合框架(LinkedList的特有功能) 集合框架(栈和队列数据结构) 集合框架(用L ...
- oracle中number类型最简单明了解释
NUMBER (p,s) p和s范围: p 1-38 s -84-127 number(p,s),s大于0,表示有效位最大为p,小数位最多为s,小数点右边s位置开始四舍五入,若s>p,小数点右侧 ...
- Storm同步调用之DRPC模型探讨
摘要:Storm的编程模型是一个有向无环图,决定了storm的spout接收到外部系统的请求后,spout并不能得到bolt的处理结果并将结果返回给外部请求.所以也就决定了storm无法提供对外部系统 ...
- org.springframework.core.io包内的源码分析
前些日子看<深入理解javaweb开发>时,看到第一章java的io流,发觉自己对io流真的不是很熟悉.然后看了下JDK1.7中io包的一点点代码,又看了org.springframewo ...
- CentOS 引导 Win10 启动项
因为无聊,所以想尝试一下双系统,所以在win10的基础之上,装了一个Linux系统,之前装过Ubuntu,几乎都是自动完成的无任何压力.但是想着Ubuntu好像更新换代有点快,所以换了个能用比较久的C ...
- .NET第四章总结
.NET第四章简单总结 1.简单的获取文件路径: 2.回车跳转控件焦点 3.*************无标题窗体拖动!!************* 1): ...
- http://codeforces.com/contest/610/problem/D
D. Vika and Segments time limit per test 2 seconds memory limit per test 256 megabytes input standar ...
- python---time模块使用详解
python中的time模块提供一些方法用来进行关于时间的操作,time模块中有以下方法可供使用: time() --- 返回当前时间的时间戳. 调用:time.time(), 可用于计算程序运行的 ...
- 前端基础之JavaScript
什么是JavaScript? JavaScript,也称ECMAScript,是一种基于对象和事件驱动并具有相对安全性并广泛用于客户端网页开发的脚本语言,同时也是一种广泛用于客户端Web开发的脚本语言 ...