专栏首页林德熙的博客VisualStudio 2019 尝试使用 C# 8.0 新的方式 可空类型Range异步的流

VisualStudio 2019 尝试使用 C# 8.0 新的方式 可空类型Range异步的流

在安装了几天之后,终于有了 VisualStudio 2019 于是再安装了 dotnet core 3.0 预览版,现在可以来尝试使用 C# 8.0 的新方式

新的 VisualStudio 界面十分清真,此时可以通过标签找到自己可以创建的项目

找到一个简单的控制台项目,创建的界面也很简单

虽然界面不错,但是创建项目的速度没有加快,等了很久,终于看到和之前没有多少修改的界面

在按下调试的时候,发现有一些按钮的界面修改,如下一步的按钮

当前,在使用之前需要做一些准备,首先是下载 dotnet core 3.0 不然一些功能不能使用

右击项目,编辑一下 csproj 文件

 <Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp3.0</TargetFramework>
  </PropertyGroup>

</Project>

右击项目属性,在生成页面选择用最新语言

可空类型

现在可以提示开发者写出可能为空的代码,如 string 默认可以设置为不可空

        static void Main(string[] args)
        {
            string str = null;
            Console.WriteLine(str);
        }

以前这样写代码是可以的,但是现在,可以在 csproj 文件里面添加 NullableReferenceTypes 此时就会在设置 string 为空提示

现在的 csproj 需要添加 NullableReferenceTypes 请看下面

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp3.0</TargetFramework>
    <LangVersion>8.0</LangVersion>
    <NullableReferenceTypes>true</NullableReferenceTypes>
  </PropertyGroup>

</Project>

再次编译一下项目,虽然可以看到项目编译通过,但是可以看到下面的警告

现在对于 string 是不可空的,但是为了兼容以前的代码,没有强制让编译不通过。同时提供了可空的字符串,也就是 string? 请看代码

            string? str = null;
            Console.WriteLine(str);

那么原来的 str[0] 的这些写法需要怎么修改呢?

答案是可以不修改,直接写

            string? str = null;
            var foo = str[0];
            Console.WriteLine(str);

但是编译的时候会出现下面的警告

warning CS8602: Possible dereference of a null reference.

如果需要在 string 判断为空的时候不使用,可以使用下面的方法

            string? str = null;
            var foo = str?[0];
            Console.WriteLine(str);

Range

第二个好玩的是 Range 可以指定使用数组的哪些内容

            var foo = new[] { "1 lindexi", "2 doubi", "3 csdn" };

            foreach(var temp in foo[0..1])
            {
                Console.WriteLine(temp);
            }

此时输出从第 0 元素到第 1 元素,不包括第 1 元素的值

1 lindexi

如果修改为 foo[0..2] 就会输出

1 lindexi
2 doubi

如果需要从第 1 个元素到最后一个元素,可以这样写

            var foo = new[] { "1 lindexi", "2 doubi", "3 csdn" };

            foreach(var temp in foo[1..])
            {
                Console.WriteLine(temp);
            }

            // 2 doubi
            // 3 csdn

如果想要从第 0 个元素输出到倒数第一个元素,不包括倒数第一个元素,可以这样写

            var foo = new[] { "1 lindexi", "2 doubi", "3 csdn" };

            foreach(var temp in foo[1..^1])
            {
                Console.WriteLine(temp);
            }

            // 2 doubi

当然 1..2 这个只是一个语法糖,这是一个 Range 类

            Range range = 1..2;

            foreach (var temp in foo[range])
            {
                Console.WriteLine(temp);
            }

关于 Range 请看Range Type in C# 8 - .NET Core Tutorials

C# 8中的范围类型(Range Type) - LamondLu - 博客园

异步的流

可以通过 async 修饰 yield 返回的方法

            await foreach (var temp in Foo())
            {
                Console.WriteLine(temp);
            }

            async IAsyncEnumerable<string> Foo()
            {
                foreach(var temp in new[] { "1 lindexi", "2 doubi", "3 csdn" })
                {
                    await Task.Delay(100);
                    yield return temp;
                }
            }

这样就可以异步返回

听说安装了 VisualStudio 预览版就无法安装正式版,除非重装系统,所以小伙伴要不要也来弄个预览版玩一下,点击安装预览版

更多请看 Building C# 8.0

参见:Take C# 8.0 for a spin

[翻译]初试C# 8.0 - WAKU - 博客园


本文会经常更新,请阅读原文: https://lindexi.gitee.io/post/VisualStudio-2019-%E5%B0%9D%E8%AF%95%E4%BD%BF%E7%94%A8-C-8.0-%E6%96%B0%E7%9A%84%E6%96%B9%E5%BC%8F.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接: https://lindexi.gitee.io ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • git 修改commit日期为之前的日期

    我在之前修改了一个文件,但是没有commit,现在我想要commit,日期为那天的日期 git 修改日期的方法很简单,因为有一个命令--date 可以设置 gi...

    林德熙
  • C# 简单读取文件 读取文件为二进制读取文件为字符串

    如果有找到比我上面代码更少的方法请告诉我,这里不用安装第三方的库,是在快速创建新的项目进行测试

    林德熙
  • win10 UWP 应用设置

    win10 UWP 应用设置 简单的把设置需要的,放到微软自带的LocalSettings LocalSettings.Values可以存放几乎所有数据 如果需...

    林德熙
  • 剑指Offer的学习笔记(C#篇)-- 左旋转字符串

    举例子吧。ABC DEF -- -- DEF ABC (变前三位就这样了)

    WeiMLing
  • 华为oj之【中级】单词倒排

    3、要求倒排后的单词间隔符以一个空格表示;如果原字符串中相邻单词间有多个间隔符时,倒排转换后也只允许出现一个空格间隔符;

    Enjoy233
  • 正则去除html字符串中的注释、标签、属性

    ProsperLee
  • 控制台断点调试

    HTML5学堂:在项目开发过程中,难免会需要调试一些数据,而大量的console.log()需要频繁切换JS和页面,同时最后有可能还忘记删除打印信息。使用断点调...

    HTML5学堂
  • R语言作图——导出高清图

    上一次小仙同学分享了 facet violin plot的画法,最后还卖了个关子,给大家留了个悬念。科研文章的插图通常要求比较高,不仅要精准地展示出数据,选对图...

    一只羊
  • 每日一题C++版(统计字符个数)

    编程是很多偏计算机、人工智能领域必须掌握的一项技能,此编程能力在学习和工作中起着重要的作用。因此小白决定开辟一个新的板块“每日一题”,通过每天一道编程题目来强化...

    小白学视觉
  • [快学Python3]迭代器和生成器

    迭代器 迭代是Python最强大的功能特色,是遍历访问序列元素的一种方式。 迭代器的特性是: 可以记住当前遍历位置 只能往前遍历,不能后退 从序列的第一个元素开...

    苦叶子

扫码关注云+社区

领取腾讯云代金券