Visual Studio 2019 preview中体验C# 8.0新语法

准备工作:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/278735.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jQuery 对HTML的操作(二)

文章目录一、jQuery获取、设置HTML标签的内容和属性获得内容 - text()、html() 以及 val()获取属性 - attr()&#xff0c;prop()二、增删 HTML 的内容增加删除三、操作CSSaddClass 添加removeClass 删除toggleClass 切换css 获取与设置所有操作html、css方法参考 ☆四、操作元素…

roku能不能安装软件_如何在Roku中使用Google Assistant

roku能不能安装软件As more of our devices connect to each other, it’s always nice to know that different products from different companies work together. A Chromecast isn’t expensive, but being able to use your TV directly with Google Assistant is better.…

如何使用卡巴斯基急救盘清理感染的PC

When you’re dealing with a PC that is completely infected in viruses, sometimes the best thing to do is reboot into a rescue disk and run a full virus scan from there. Here’s how to use the Kaspersky Rescue Disk to clean an infected PC. 当您要处理一台完全…

jQuery杂项进阶(四)

文章目录一、$ 的替换二、使用JSONP实现跨域三、jQuery 杂项方法、实用工具、回调对象、延迟对象参考 ☆四、jQuery 自身属性参考 ☆五、jQuery 插件介绍和参考 ☆jQuery 树型菜单插件(Treeview)jQuery Validate表单验证&#xff0c;jQuery Password Validation&#xff08;密码…

什么是WLIDSVC.EXE和WLIDSVCM.EXE,它们为什么运行?

You’re no doubt reading this article because you’re wondering what those two processes are doing cluttering up Task Manager, and also wondering why they are in capital letters. You’ve come to the right place. 毫无疑问&#xff0c;您阅读本文是因为您想知道…

linux压缩和解压缩_Linux QuickTip:一步下载和解压缩

linux压缩和解压缩Most of the time, when I download something it’s a file archive of some kind – usually a tarball or a zip file. This could be some source code for an app that isn’t included in Gentoo’s Portage tree, some documentation for an internal …

Spark架构与作业执行流程简介

2019独角兽企业重金招聘Python工程师标准>>> Spark架构与作业执行流程简介 博客分类&#xff1a; spark Local模式 运行Spark最简单的方法是通过Local模式&#xff08;即伪分布式模式&#xff09;。 运行命令为&#xff1a;./bin/run-example org.apache.spark.exam…

Spring boot整合Mongodb

最近的项目用了Mongodb&#xff0c;网上的用法大多都是七零八落的没有一个统一性&#xff0c;自己大概整理了下&#xff0c;项目中的相关配置就不叙述了&#xff0c;由于spring boot的快捷开发方式&#xff0c;所以spring boot项目中要使用Mongodb&#xff0c;只需要添加依赖和…

nodejs和Vue和Idea

文章目录Vue环境搭建Idea安装Idea中配置Vue环境Node.js介绍npm介绍Vue.js介绍[^3]Idea介绍Vue环境搭建 概述&#xff1a;vue环境搭建&#xff1a;需要npm&#xff08;cnpm&#xff09;&#xff0c;而npm内嵌于Node.js&#xff0c;所以需要下载Node.js。 下载Node.js&#xff1…

Spring MVC上下文父子容器

2019独角兽企业重金招聘Python工程师标准>>> Spring MVC上下文父子容器 博客分类&#xff1a; java spring 在Spring MVC的启动依赖Spring框架&#xff0c;有时候我们在启动Spring MVC环境的时候&#xff0c;如果配置不当的话会造成一些不可预知的结果。下面主要介绍…

12.7 Test

目录 2018.12.7 TestA 序列sequence(迭代加深搜索)B 轰炸bomb(Tarjan DP)C 字符串string(AC自动机 状压DP)考试代码AC2018.12.7 Test题目为2018.1.4雅礼集训。 时间&#xff1a;4.5h期望得分&#xff1a;010010实际得分&#xff1a;010010 A 序列sequence(迭代加深搜索) 显然可…

word文档中统计总页数_如何在Google文档中查找页数和字数统计

word文档中统计总页数Whether you’ve been given an assignment with a strict limit or you just like knowing how many words you’ve written, Google Docs has your back. Here’s how to see exactly how many words or pages you’ve typed in your document. 无论您是…

vue 入门notes

文章目录vue一、js基础二、封装缓存三、组件1、组件创建、引入、挂载、使用2、组件间的传值- 父组件主动获取子组件的数据和方法&#xff08;子组件给父组件传值&#xff09;&#xff1a;- 子组件主动获取父组件的数据和方法&#xff08;父组件给子组件传值&#xff09;&#x…

spring集成 JedisCluster 连接 redis3.0 集群

2019独角兽企业重金招聘Python工程师标准>>> spring集成 JedisCluster 连接 redis3.0 集群 博客分类&#xff1a; 缓存 spring 客户端采用最新的jedis 2.7 1. maven依赖&#xff1a; <dependency> <groupId>redis.clients</groupId> <artifact…

火狐浏览器复制网页文字_从Firefox中的网页链接的多种“复制”格式中选择

火狐浏览器复制网页文字Tired of having to copy, paste, and then format links for use in your blogs, e-mails, or documents? Then see how easy it is to choose a click-and-go format that will save you a lot of time and effort with the CoLT extension for Firef…

vscode配置、使用git

文章目录一、下载、配置git二、vscode配置并使用git三、记住密码一、下载、配置git 1、git-win-x64点击下载后安装直接安装&#xff08;建议复制链接用迅雷等下载器下载&#xff0c;浏览器太慢&#xff0c;记住安装位置&#xff09;。 2、配置git环境变量&#xff1a; 右键 此…

BTrace功能

2019独角兽企业重金招聘Python工程师标准>>> BTrace功能 一、背景 在生产环境中可能经常遇到各种问题&#xff0c;定位问题需要获取程序运行时的数据信息&#xff0c;如方法参数、返回值、全局变量、堆栈信息等。为了获取这些数据信息&#xff0c;我们可以…

.NET(c#) 移动APP开发平台 - Smobiler(1)

原文&#xff1a;https://www.cnblogs.com/oudi/p/8288617.html 如果说基于.net的移动开发平台&#xff0c;目前比较流行的可能是xamarin了&#xff0c;不过除了这个&#xff0c;还有一个比xamarin更好用的国内的.net移动开发平台&#xff0c;smobiler&#xff0c;不用学习另外…

如何在Vizio电视上禁用运动平滑

Vizio维齐奥New Vizio TVs use motion smoothing to make the content you watch appear smoother. This looks good for some content, like sports, but can ruin the feel of movies and TV shows. 新的Vizio电视使用运动平滑来使您观看的内容显得更平滑。 这对于某些内容(例…

无服务器架构 - 从使用场景分析其6大特性

2019独角兽企业重金招聘Python工程师标准>>> 无服务器架构 - 从使用场景分析其6大特性 博客分类&#xff1a; 架构 首先我应该提到&#xff0c;“无服务器”技术肯定有服务器涉及。 我只是使用这个术语来描述这种方法和技术&#xff0c;它将任务处理和调度抽象为与…