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