Visual Studio 2019 preview中体验C# 8.0新语法
准备工作:
Visual Studio 2019 Preview版本中并没有包含所有的C# 8.0的新功能,但目前也有一些可以试用了。在开始之前,需要进行入两项设置:
- 将Framework设置为.net core 3.0
- 将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主要干了两件事:
- 可以通过对象声明判断该对象是否可能为空。
- 当可空对象使用在不可空的场景是,会报告警。
虽然之前有一些第三方插件也集成了类似的功能,如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的切片操作,常见的有:
- 字符串用来子串
- Array用来划获取子数组
- 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代码没有完全匹配上所致,我们可以手动添加相关代码以完成这一编译过程。
![](/assets/blank.gif)
![](/assets/blank.gif)
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新语法相关推荐
- Visual Studio 2019安装中出现的问题(超详细)
当然有的电脑在下载和安装Visual Studio 2019时会出现以下情况:明明网络很好,却一直显示下载0B和0B/秒,进度条也没有动,并且过一会显示网络有问题,就算重新下载也是这样 我们可以用以下 ...
- [翻译] 使用 Visual Studio 2019 来提高每个开发人员的工作效率
原文: Making every developer more productive with Visual Studio 2019 今天,在 Microsoft Connect(); 2018 的主 ...
- Visual Studio 2019 for Mac 8.3 正式发布
Visual Studio 2019 for Mac 8.3 正式发布了,以下是这个版本中关注的三个重要内容: Support for .NET Core 3, .NET Standard 2.1, ...
- Visual Studio 2019 发行说明
原文:https://docs.microsoft.com/zh-cn/visualstudio/releases/2019/release-notes 单击按钮即可下载最新版 Visual Stud ...
- [翻译] Visual Studio 2019 RC版发布
今天,我们将分享 Visual Studio 2019 的发布候选版(RC 版) - 这是在 4 月 2 日的虚拟发布活动上正式发布之前的最后步骤之一. 您可以在 visualstudio.com/d ...
- vs2019Linux守护,Visual Studio 2019将支援Ninja显着提升Linux专案建置效率
微软更新Visual Studio 2019,新增多个可提升Linux开发体验的功能,包括在Linux上支援建置系统Ninja,以及更完整地支援gdbserver,而且现在开发者也可以使用连接管理器( ...
- Visual Studio 2019预览,净生产力
本文章为机器翻译. https://blogs.msdn.microsoft.com/dotnet/2018/12/13/visual-studio-2019-net-productivity/ 该文 ...
- Visual Studio 2019 RC入门——第1部分
目录 介绍 背景 语言包 打开Visual Studio 2019 RC 克隆或检查我们的代码 打开项目或解决方案 打开本地文件夹 无代码继续 创建一个新项目 兴趣点 介绍 在本文中,让我们看看如何开 ...
- Visual Studio 2019 首个候选发布版发布
微软正式公布了 Visual Studio 2019 首个候选发布版(即 Visual Studio 2019 RC 版),这一版本标志着 Visual Studio 2019 的开发基本接近尾声,正 ...
最新文章
- VB动态添加WebBrowser控件,并拦截弹出窗口(不用引用任何组件)
- DIV水平方向居中的几种方法
- NTU课程 CE7454 回归与分类
- php打png图片水印颜色失真,ThinkPHP水印功能实现修复PNG透明水印并增加JPEG图片质量可调整...
- 华晨集团债务违约65亿 宝马中国:华晨宝马运营不受影响
- 组态软件MCGS(昆仑通态)初识
- 安卓游戏广告加速插件_安卓迅游加速器,无需登陆免费加速,国内外游戏均可加速下载...
- 零基础如何用平面设计排版软件PS进行布局构图
- 计算机优化英语课堂教学,多媒体课件优化英语课堂的反思性研究
- 无需Root实现Android手机屏幕流畅投影到电脑进行演示(附软件下载)
- S5p4418 启动配制分析
- html为知笔记模板,为知笔记如何建立模板教程
- npm切换到百度镜像源
- Java基础:方法和类详解
- 测试用例(功能用例)——完整demo(一千多条测试用例)
- unity 如何获取系统时间
- 【华为_WLAN】AP4030DN 由 FIT AP 更新至 FAT AP(Uboot方式)
- 全程干货,用 python 下载某站全部【免抠图片】,图片背景透明,格式PNG
- Oracle表空间的理解和使用
- 流体力学有限元法(三)
热门文章
- win10计算机本地无法连接,win10无法连接到这个网络怎么办_win10无法连接到这个网络如何解决...
- mysql rename所标时间_mysql rename命令
- RocketMQ中主从复制
- php 中如何重载父类的方法_PHP中子类重载父类的方法【parent::方法名】
- 盘点Linux下19 个有趣的命令!
- 如何在 JavaScript 中更好地使用数组
- ios 标签 html,ios 显示HTML标签文本
- apk私钥_获取APK证书MD5、SHA1、SHA256等秘钥
- 提升UI技能的5个步骤
- open-falcon_NASA在Falcon 9上带回了蠕虫-其背后的故事是什么?