C# 7.1先睹为快(第一部分)

2023-11-06 18:18

本文主要是介绍C# 7.1先睹为快(第一部分),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

自2003年以来,Microsoft首次考虑对C#使用带小数点后位数的版本。当前暂定下一个版本是C# 7.1,其中有望包括:异步Main函数(Async Main)、默认表达式(Default Expression)、推导元组名(Infer Tuple Names)和使用泛型的模式匹配(Pattern-matching with Generics)等。

异步Main函数

最让测试异步代码的开发人员沮丧的,无疑是控制台应用当前不支持异步入口点(EntryPoint)。虽然变通方法是编写多行样板代码,但是这样的模式依赖于对方法的非正常使用,难于理解。例如:

ublic static void Main()
{MainAsync().GetAwaiter().GetResult();
}
private static async Task MainAsync()
{... // 程序主代码。
}

为解决这个问题,在“异步Main函数建议”中,添加了如下四个新的函数签名,罗列了可能的入口点。

static Task Main()
static TaskMain()
static Task Main(string[])
static TaskMain(string[]) 

如果代码中不存在另一个非异步Main函数,那么只要给出一个上述的入口点函数,编译器就会生成所需的样板代码。唯一的限制是需要向后兼容。

Microsoft曾考虑允许“async void Main()”,但是这种做法会使编译器更复杂,并且Microsoft总体上并不鼓励在事件处理器之外使用“async void”。

默认值(即Nothing)

VB没有表示“null”的关键字,这是C#和VB间的一个微妙的差别。但是VB有一个关键字“Nothing”。在语言技术规范中,对该关键字给出了如下说明:

Nothing是一个特殊的常值。它没有类型,可转换为类型系统中的任意类型,也包括类型参数。在转换为某个特定类型后,它等价于该类型的默认值。

C#当前使用“default(T)”模式实现同一效果,但略为繁琐,尤其是类的名字很长时。C# 7.1中将提供一个“默认常值”(Default Literal),其描述为:

这一类型的表达式可通过常值转换为默认值或null值,隐式地转换为any类型。

该类型向默认常值的推理与向null常值推理的工作机制一样,除非允许any类型(不只是引用类型)。

在可以使用null的地方,通常也可以使用默认常值。这一做法被看成是C#建议中的一个倒退,可能因为人们通常会对两个非常类似的方法完成同一件事大皱眉头。在设计会议纪要中,就有人提出疑问:

我们是否正在挑起类型之争?

一个使用默认常值的例子如下:

ImmutableArrayx = default;
return default;
void Method(ImmutableArrayarrayOpt = default) var x = new[] { default, ImmutableArray.Create(y) }; const int x = default; if (x == default) if (x is default) y = default as RefType //编译器告警:总是null。 int i = default 

下面例子给出的是对默认常值的非法使用:

const int? y = default;
if (default == default)
if (default is T)
var i = default
throw default

后者无疑是一个C#设计上的奇特构件。在设计会议纪要中,给出了如下说法:

在C#中,允许开发人员抛出null。这会引发一个运行时错误,进而导致抛出一个NullReferenceException异常。因此,抛出NullReferenceException并非正大光明的,而是一种丑陋的模式。

完全没有理由允许抛出默认值。我们并不认为用户会感觉这是可行的,或是了解它的工作机制。

Microsoft并未引入默认常值,而是考虑通过扩展“null”实现同一效果。因为在VB中“nothing”和“null”是两个不同的关键词,所以在VB中可以这样做。即使不使用关键字,VB中也具有null的概念。因此,开发人员可以看到“NothingReferenceException”这样的异常。

在C#中,开发人员可能常会有这样的一个疑问:“null是否表示的是实际的空值,或是表示了可能为空值也可能不为空值的默认值?”我们认为,这是一个令人非常困惑的问题。

在本文的第二部分中,我们将介绍元组和模式匹配。

原文地址:http://www.infoq.com/cn/news/2017/06/CSharp-7.1-a


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

这篇关于C# 7.1先睹为快(第一部分)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/358248

相关文章

2. c#从不同cs的文件调用函数

1.文件目录如下: 2. Program.cs文件的主函数如下 using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;using System.Windows.Forms;namespace datasAnalysis{internal static

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

用命令行的方式启动.netcore webapi

用命令行的方式启动.netcore web项目 进入指定的项目文件夹,比如我发布后的代码放在下面文件夹中 在此地址栏中输入“cmd”,打开命令提示符,进入到发布代码目录 命令行启动.netcore项目的命令为:  dotnet 项目启动文件.dll --urls="http://*:对外端口" --ip="本机ip" --port=项目内部端口 例: dotnet Imagine.M

poj 2976 分数规划二分贪心(部分对总体的贡献度) poj 3111

poj 2976: 题意: 在n场考试中,每场考试共有b题,答对的题目有a题。 允许去掉k场考试,求能达到的最高正确率是多少。 解析: 假设已知准确率为x,则每场考试对于准确率的贡献值为: a - b * x,将贡献值大的排序排在前面舍弃掉后k个。 然后二分x就行了。 代码: #include <iostream>#include <cstdio>#incl

C# dateTimePicker 显示年月日,时分秒

dateTimePicker默认只显示日期,如果需要显示年月日,时分秒,只需要以下两步: 1.dateTimePicker1.Format = DateTimePickerFormat.Time 2.dateTimePicker1.CustomFormat = yyyy-MM-dd HH:mm:ss Tips:  a. dateTimePicker1.ShowUpDown = t

C#关闭指定时间段的Excel进程的方法

private DateTime beforeTime;            //Excel启动之前时间          private DateTime afterTime;               //Excel启动之后时间          //举例          beforeTime = DateTime.Now;          Excel.Applicat

C# 防止按钮botton重复“点击”的方法

在使用C#的按钮控件的时候,经常我们想如果出现了多次点击的时候只让其在执行的时候只响应一次。这个时候很多人可能会想到使用Enable=false, 但是实际情况是还是会被多次触发,因为C#采用的是消息队列机制,这个时候我们只需要在Enable = true 之前加一句 Application.DoEvents();就能达到防止重复点击的问题。 private void btnGenerateSh

C# double[] 和Matlab数组MWArray[]转换

C# double[] 转换成MWArray[], 直接赋值就行             MWNumericArray[] ma = new MWNumericArray[4];             double[] dT = new double[] { 0 };             double[] dT1 = new double[] { 0,2 };

笔记整理—内核!启动!—kernel部分(2)从汇编阶段到start_kernel

kernel起始与ENTRY(stext),和uboot一样,都是从汇编阶段开始的,因为对于kernel而言,还没进行栈的维护,所以无法使用c语言。_HEAD定义了后面代码属于段名为.head .text的段。         内核起始部分代码被解压代码调用,前面关于uboot的文章中有提到过(eg:zImage)。uboot启动是无条件的,只要代码的位置对,上电就工作,kern

C# Hash算法之MD5、SHA

MD5我们用的还是比较多的,一般用来加密存储密码。但是现在很多人觉MD5可能不太安全了,所以都用上了SHA256等来做加密(虽然我觉得都差不多,MD5还是能玩)。 还是跟上一篇说的一样,当一个算法的复杂度提高的同时肯定会带来效率的降低,所以SHA和MD5比较起来的话,SHA更安全,MD5更高效。 由于HASH算法的不可逆性,所以我认为MD5和SHA主要还是应用在字符串的"加密"上。 由于