美文网首页野生技术宅协会
.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