准备工作:

Visual Studio 2019 Preview版本中并没有包含所有的C# 8.0的新功能,但目前也有一些可以试用了。在开始之前,需要进行入两项设置:

  1. 将Framework设置为.net core 3.0
  2. 将C#语法设置为8.0

也可以直接编辑.csproj文件,修改TargetFramework和LangVersion为如下形式:

<TargetFramework>netcoreapp3.0</TargetFramework>
     <LangVersion>8.0</LangVersion>

Nullable reference types

空引用对于所有编程者来说相信都是一个非常头痛的问题,图灵奖得主Tony Hoare 就把包含空引用的编程语言用定义为一个十亿美元的错误Null References: The Billion Dollar Mistake。

首先还是来一段简单的代码:

string s = null;
     Console.WriteLine($"The first letter of {s} is {s[0]}");

这段代码编译没有问题,但运行的时候会抛空引用异常的。

在C# 8.0中,开启了空引用异常检测后,上述代码在编译器就会检查出告警来。

并且它会结合上下文判断,如果该值不会为null,则不会告警,非常智能。

细心的朋友可能会发现,虽然在下面使用的地方没有告警,但是变量初始化的地方还是报告警了。如果我们的程序本身就是允许null值改怎么办呢,放任告警不管也是不合适的做法。

针对这个问题,C#引入了一个新的声明为可空对象的语法:

string? s = null;

也就是在类型后加一个?符号,表面该对象是一个可空对象。

由于这个行为和之前的C#版本是不一致的,因此默认是没有开启这个功能的,我们需要在csproj文件中打开这个设置:

<LangVersion>8.0</LangVersion>
     <NullableReferenceTypes>true</NullableReferenceTypes>

不知道在后续的VS的版本中会不会直接再界面上添加这一设置。

最后总结一下,Nullable reference types主要干了两件事:

  1. 可以通过对象声明判断该对象是否可能为空。
  2. 当可空对象使用在不可空的场景是,会报告警。

虽然之前有一些第三方插件也集成了类似的功能,如Resharper的Null Check,但把这个功能集成到了编译器上后更加简洁好用。

C#的空对象检查在设计期间也有好几种语法方案,目前这种方案既解决了问题,又对现有代码保持完全兼容,还能对现有代码潜在性问题能进行分析,是一种比较理想的方案的。如果以后能通过设置,将空引用的告警级别可以设置为错误就更好了。

Ranges and indices

范围和索引是C#新引入的语法,它主要引入了两个对象Range和Index。

Index

首先还是来看一个简单的例子。

var numbers = new[] { 1, 2, 3, 4, 5, 6, 7 };
     Index i1 = 3; // number 3 from beginning
     Index i2 = ^2; // number 2 from end
     Console.WriteLine($"{numbers[i1]}, {numbers[i2]}"); // "4, 6"

这个例子简单的演示了一下Index的用法,Index本身还是类似于之前的int索引的,它也可以和int类型转换。但Index在int索引的方式扩展了一下,支持从后往前访问,也就是我们说的倒数位。

Index i2 = ^2; // number 2 from end

Range

基于Index组成起点和终点,可以组成了一个范围Range,根据Range可以对数组进行切片。

     Range range = Range.Create(i1, i2);     int[] slice = numbers[range];        //"4, 5"

".."运算符

为了快速表示一个Range,C#还映入了一个新的运算符".."如上面的代码就可以简写为:

     int[] slice = numbers[i1..i2];        //"4, 5"

".."语法不复杂,通过".."连接的开头和结尾的索引,用来表示一个范围。为了使用方便,".."运算符的开头和结尾是可以省略的,常用的大致就有这几种形式。

     string text = "hello c# 8.0";     Console.WriteLine(text[..]); //"hello c# 8.0"     Console.WriteLine(text[^3..]);      //"8.0"     Console.WriteLine(text[..5]);       //"hello"     Console.WriteLine(text[6..]);       //"c# 8.0"

通过".."运算符,我们描述切片时可以清晰很多,例如如下这个常见的求字符串子串的例子:

     var sub = text.Substring(text.Length - 6, 6);     var sub2 = text[^6..];

.net 3.0的很多类都内置了对Range的切片操作,常见的有:

  1. 字符串用来子串
  2. Array用来划获取子数组
  3. span<T>用来切片

Asynchronous streams

异步流能一种拉的方式进行异步迭代,配合async编程可以以异步的方式把socket流像本地文件一样解析,相信这是很多用c#写socket程序的程序员所喜欢的一个特性。

一个简单的示例如下:

     static async IAsyncEnumerable<string> GetNamesAsync()     {        await Task.Delay(1000);        yield return "hello";        await Task.Delay(1000);        yield return "world";     }

     await foreach (var name in GetNamesAsync())     {        Console.WriteLine(name);     } 

我在Visual Studio 2019 preview中试用这个功能的时候,发现无法编译通过。MS解释说这个是VS和.net core代码没有完全匹配上所致,我们可以手动添加相关代码以完成这一编译过程。

namespace System.Threading.Tasks
{using System.Runtime.CompilerServices;using global::System.Threading.Tasks.Sources;internal struct ManualResetValueTaskSourceLogic<TResult>{private ManualResetValueTaskSourceCore<TResult> _core;public ManualResetValueTaskSourceLogic(IStrongBox<ManualResetValueTaskSourceLogic<TResult>> parent) : this() { }public short Version => _core.Version;public TResult GetResult(short token) => _core.GetResult(token);public ValueTaskSourceStatus GetStatus(short token) => _core.GetStatus(token);public void OnCompleted(Action<object> continuation, object state, short token, ValueTaskSourceOnCompletedFlags flags) => _core.OnCompleted(continuation, state, token, flags);public void Reset() => _core.Reset();public void SetResult(TResult result) => _core.SetResult(result);public void SetException(Exception error) => _core.SetException(error);}
}namespace System.Runtime.CompilerServices
{internal interface IStrongBox<T> { ref T Value { get; } }
}

View Code

其他语法

本身C# 8.0是还有几个其它语法的,如接口默认方法,高级模式匹配等。这些语法在目前的VS 2019 preview中还无法体验。估计后续会慢慢放开的,到时候我再写相关文章介绍它们。

相关文章:

https://blogs.msdn.microsoft.com/dotnet/2018/12/05/take-c-8-0-for-a-spin/

转载于:https://www.cnblogs.com/TianFang/p/10076992.html

Visual Studio 2019 preview中体验C# 8.0新语法相关推荐

  1. Visual Studio 2019安装中出现的问题(超详细)

    当然有的电脑在下载和安装Visual Studio 2019时会出现以下情况:明明网络很好,却一直显示下载0B和0B/秒,进度条也没有动,并且过一会显示网络有问题,就算重新下载也是这样 我们可以用以下 ...

  2. [翻译] 使用 Visual Studio 2019 来提高每个开发人员的工作效率

    原文: Making every developer more productive with Visual Studio 2019 今天,在 Microsoft Connect(); 2018 的主 ...

  3. Visual Studio 2019 for Mac 8.3 正式发布

    Visual Studio 2019 for Mac 8.3 正式发布了,以下是这个版本中关注的三个重要内容: Support for .NET Core 3, .NET Standard 2.1,  ...

  4. Visual Studio 2019 发行说明

    原文:https://docs.microsoft.com/zh-cn/visualstudio/releases/2019/release-notes 单击按钮即可下载最新版 Visual Stud ...

  5. [翻译] Visual Studio 2019 RC版发布

    今天,我们将分享 Visual Studio 2019 的发布候选版(RC 版) - 这是在 4 月 2 日的虚拟发布活动上正式发布之前的最后步骤之一. 您可以在 visualstudio.com/d ...

  6. vs2019Linux守护,Visual Studio 2019将支援Ninja显着提升Linux专案建置效率

    微软更新Visual Studio 2019,新增多个可提升Linux开发体验的功能,包括在Linux上支援建置系统Ninja,以及更完整地支援gdbserver,而且现在开发者也可以使用连接管理器( ...

  7. Visual Studio 2019预览,净生产力

    本文章为机器翻译. https://blogs.msdn.microsoft.com/dotnet/2018/12/13/visual-studio-2019-net-productivity/ 该文 ...

  8. Visual Studio 2019 RC入门——第1部分

    目录 介绍 背景 语言包 打开Visual Studio 2019 RC 克隆或检查我们的代码 打开项目或解决方案 打开本地文件夹 无代码继续 创建一个新项目 兴趣点 介绍 在本文中,让我们看看如何开 ...

  9. Visual Studio 2019 首个候选发布版发布

    微软正式公布了 Visual Studio 2019 首个候选发布版(即 Visual Studio 2019 RC 版),这一版本标志着 Visual Studio 2019 的开发基本接近尾声,正 ...

最新文章

  1. VB动态添加WebBrowser控件,并拦截弹出窗口(不用引用任何组件)
  2. DIV水平方向居中的几种方法
  3. NTU课程 CE7454 回归与分类
  4. php打png图片水印颜色失真,ThinkPHP水印功能实现修复PNG透明水印并增加JPEG图片质量可调整...
  5. 华晨集团债务违约65亿 宝马中国:华晨宝马运营不受影响
  6. 组态软件MCGS(昆仑通态)初识
  7. 安卓游戏广告加速插件_安卓迅游加速器,无需登陆免费加速,国内外游戏均可加速下载...
  8. 零基础如何用平面设计排版软件PS进行布局构图
  9. 计算机优化英语课堂教学,多媒体课件优化英语课堂的反思性研究
  10. 无需Root实现Android手机屏幕流畅投影到电脑进行演示(附软件下载)
  11. S5p4418 启动配制分析
  12. html为知笔记模板,为知笔记如何建立模板教程
  13. npm切换到百度镜像源
  14. Java基础:方法和类详解
  15. 测试用例(功能用例)——完整demo(一千多条测试用例)
  16. unity 如何获取系统时间
  17. 【华为_WLAN】AP4030DN 由 FIT AP 更新至 FAT AP(Uboot方式)
  18. 全程干货,用 python 下载某站全部【免抠图片】,图片背景透明,格式PNG
  19. Oracle表空间的理解和使用
  20. 流体力学有限元法(三)

热门文章

  1. win10计算机本地无法连接,win10无法连接到这个网络怎么办_win10无法连接到这个网络如何解决...
  2. mysql rename所标时间_mysql rename命令
  3. RocketMQ中主从复制
  4. php 中如何重载父类的方法_PHP中子类重载父类的方法【parent::方法名】
  5. 盘点Linux下19 个有趣的命令!
  6. 如何在 JavaScript 中更好地使用数组
  7. ios 标签 html,ios 显示HTML标签文本
  8. apk私钥_获取APK证书MD5、SHA1、SHA256等秘钥
  9. 提升UI技能的5个步骤
  10. open-falcon_NASA在Falcon 9上带回了蠕虫-其背后的故事是什么?