.NET Core 3 Preview 2新功能概览

自从微软宣布.NET Core 3一来,我就一直期待着它早日发布。最近几天.NET Core 3 的第二个预览版也放出来了,由于是预览版,暂时还不能用于生产环境,所以我也就不找下载连接了。不过新功能还是要看一看的,免得到时候正式版出来一脸懵逼。

C# 8

其中最亮眼的自然是C#了,作为.NET平台的亲儿子,C#的发展也一直受到各种关注。本次C# 8也到来了,自然各种新功能和好吃的语法糖是少不了的。

using声明

第一个新语法是using声明。原来使用C#自动管理资源的时候,必须using语句,然后在大括号语句块内进行操作,using作用域结束后使用的资源会自动释放。在Java等语言中也有类似做法。

        static void Main()
        {
            var filename = "Program.cs";
            var line = string.Empty;
            var magicString = "magicString";
            var file = new FileInfo(filename);
            // using作用域结束后reader自动释放
            using (var reader = file.OpenText())
            {
                while ((line = reader.ReadLine()) != null)
                {
                    if (line.Contains(magicString))
                    {
                        WriteLine("Found string");
                        return;
                    }
                }
                WriteLine("String not found");
            }
        }

现在使用using声明可以省去大括号作用域,让代码块减少一层缩进,也能让你少打一对大括号。using声明的资源在作用域结束后会自动释放。

        static void Main()
        {
            var filename = "Program.cs";
            var line = string.Empty;
            var magicString = "magicString";
            var file = new FileInfo(filename);
            // 改用using声明
            using var reader = file.OpenText();
            while ((line = reader.ReadLine()) != null)
            {
                if (line.Contains(magicString))
                {
                    WriteLine("Found string");
                    return;
                }
            }
            WriteLine("String not found");
        } // reader会在作用域结束后自动释放

switch表达式

第二个新语法是switch表达式。C# 7引入了is表达式和switch语句的模式匹配,现在C# 8引入了switch表达式,同样也支持模式匹配。这个语法比较奇怪,所以大家第一次看到的时候可能不适应,不过这就和lambda表达式一样,一旦习惯了,用起来就很舒服了。

简单来说switch表达式是一个表达式,所以它的结果是一个值,而且它是一个中缀表达式,所以左边和右边都有操作数。switch表达式左边的操作数是要测试条件的对象,右边则是大括号包裹的,以逗号分隔的匹配列表。说起来有点麻烦,直接看官方的例子好了。

static string Display(object o) => o switch
{
 Point { X: 0, Y: 0 } => "origin",
 Point { X: var x, Y: var y } => $"({x}, {y})",
 _ => "unknown"
};

首先这是一个函数,使用了之前C#新增的语法,表达式体函数,如果一个函数直接返回一个表达式,那么就可以用箭头=>直接替换原来的方法体。重点在于第一个箭头后面的switch,这是一个switch表达式,o就是要测试的值,switch右面的花括号里面就是匹配列表,如果o的值是(0,0)的点,就返回"origin"字符串;如果是一个普通的点,就打印该点的坐标;如果是其他情况,就返回"unknown",这里的下划线_相当于switch语句的default。

如果你理解了这个例子,官方有给了一个更加复杂的例子,这次还带了元组解构的语法。可以看到,如果没有switch表达式以及模式匹配,要实现相同的功能很明显需要很多冗长的代码。

static State ChangeState(State current, Transition transition, bool hasKey) =>
 (current, transition) switch
 {
 (Opened, Close) => Closed,
 (Closed, Open) => Opened,
 (Closed, Lock) when hasKey => Locked,
 (Locked, Unlock) when hasKey => Closed,
 _ => throw new InvalidOperationException($"Invalid transition")
};

异步流

接下来一个比较重要的改进是异步流。不过官方没有多提,估计等到比较稳定的时候会详细介绍。

IEEE浮点数改进

浮点数系统也根据IEEE 754-2008修订版进行了改进以遵循规定。还增加了一下一些数学API:

  • BitIncrement/BitDecrement
  • MaxMagnitude/MinMagnitude
  • ILogB
  • ScaleB
  • Log2
  • FusedMultiplyAdd
  • CopySign

内置JSON Writer和Json Document

现在.NET Core内置了JSON Writer和Json Document类,方便大家使用。该类按照官方博客称比Json.NET快30%-80%,不过由于内置的JSON类偏底层一些,平时大家用的肯定还是Json.NET,不过如果你想自己做一些功能,就可以利用官方的底层类来实现。

下面是官方的一个实例:

static int WriteJson(IBufferWriter<byte> output, long[] extraData)
{
 var json = new Utf8JsonWriter(output, state: default);
 json.WriteStartObject();
 json.WriteNumber("age", 15, escape: false);
 json.WriteString("date", DateTime.Now);
 json.WriteString("first", "John");
 json.WriteString("last", "Smith");
 json.WriteStartArray("phoneNumbers", escape: false);
 json.WriteStringValue("425-000-1212", escape: false);
 json.WriteStringValue("425-000-1213");
 json.WriteEndArray();
 json.WriteStartObject("address");
 json.WriteString("street", "1 Microsoft Way");
 json.WriteString("city", "Redmond");
 json.WriteNumber("zip", 98052);
 json.WriteEndObject();
 json.WriteStartArray("ExtraArray");
 for (var i = 0; i < extraData.Length; i++)
 {
 json.WriteNumberValue(extraData[i]);
 }
 json.WriteEndArray();
 json.WriteEndObject();
 json.Flush(isFinalBlock: true);
 return (int)json.BytesWritten;
}

此外还对WPF与WinForms、Windows Native互操作等等进行了支持和改进,这里就不一一介绍了。相信再过不久,.NET Core 3就能正式和大家见面了。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 229,698评论 6 539
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 99,202评论 3 426
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 177,742评论 0 382
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 63,580评论 1 316
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 72,297评论 6 410
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 55,688评论 1 327
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 43,693评论 3 444
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 42,875评论 0 289
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 49,438评论 1 335
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 41,183评论 3 356
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 43,384评论 1 372
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 38,931评论 5 363
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,612评论 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 35,022评论 0 28
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 36,297评论 1 292
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 52,093评论 3 397
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 48,330评论 2 377

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,162评论 4 61
  • 一纸,一墨,一水,一笔,静,贵,难得,需珍惜
    yu余鱼君子阅读 156评论 0 0
  • 长长的人生路匆匆过,一不留神,一天过去了,一年过去了。在这样飞逝的日子里,你定神一想,貌似什么痕迹也不曾留下,不禁...
    小小_1a8c阅读 176评论 2 1
  • 說起下雨,一般人都會想起滂沱大雨,為了不被打濕衣服,路上的行人打著各花各樣的傘。為了保護自己,有的阿姨會用膠袋保護...
    Bonny天恩阅读 229评论 0 0