美文网首页野生技术宅协会
.NET Core 3 Preview 2新功能概览

.NET Core 3 Preview 2新功能概览

作者: 乐百川 | 来源:发表于2019-02-04 17:04 被阅读3次

    自从微软宣布.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就能正式和大家见面了。

    相关文章

      网友评论

        本文标题:.NET Core 3 Preview 2新功能概览

        本文链接:https://www.haomeiwen.com/subject/qcnpsqtx.html