自從微軟宣布.NET Core 3一來校套,我就一直期待著它早日發(fā)布纯续。最近幾天.NET Core 3 的第二個預(yù)覽版也放出來了,由于是預(yù)覽版羽莺,暫時還不能用于生產(chǎn)環(huán)境实昨,所以我也就不找下載連接了。不過新功能還是要看一看的盐固,免得到時候正式版出來一臉懵逼荒给。
C# 8
其中最亮眼的自然是C#了,作為.NET平臺的親兒子刁卜,C#的發(fā)展也一直受到各種關(guān)注志电。本次C# 8也到來了,自然各種新功能和好吃的語法糖是少不了的蛔趴。
using聲明
第一個新語法是using聲明溪北。原來使用C#自動管理資源的時候,必須using語句夺脾,然后在大括號語句塊內(nèi)進(jìn)行操作之拨,using作用域結(jié)束后使用的資源會自動釋放。在Java等語言中也有類似做法咧叭。
static void Main()
{
var filename = "Program.cs";
var line = string.Empty;
var magicString = "magicString";
var file = new FileInfo(filename);
// using作用域結(jié)束后reader自動釋放
using (var reader = file.OpenText())
{
while ((line = reader.ReadLine()) != null)
{
if (line.Contains(magicString))
{
WriteLine("Found string");
return;
}
}
WriteLine("String not found");
}
}
現(xiàn)在使用using聲明可以省去大括號作用域蚀乔,讓代碼塊減少一層縮進(jìn),也能讓你少打一對大括號菲茬。using聲明的資源在作用域結(jié)束后會自動釋放吉挣。
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會在作用域結(jié)束后自動釋放
switch表達(dá)式
第二個新語法是switch表達(dá)式。C# 7引入了is表達(dá)式和switch語句的模式匹配婉弹,現(xiàn)在C# 8引入了switch表達(dá)式睬魂,同樣也支持模式匹配。這個語法比較奇怪镀赌,所以大家第一次看到的時候可能不適應(yīng)氯哮,不過這就和lambda表達(dá)式一樣,一旦習(xí)慣了商佛,用起來就很舒服了喉钢。
簡單來說switch表達(dá)式是一個表達(dá)式,所以它的結(jié)果是一個值良姆,而且它是一個中綴表達(dá)式肠虽,所以左邊和右邊都有操作數(shù)。switch表達(dá)式左邊的操作數(shù)是要測試條件的對象玛追,右邊則是大括號包裹的税课,以逗號分隔的匹配列表闲延。說起來有點麻煩,直接看官方的例子好了韩玩。
static string Display(object o) => o switch
{
Point { X: 0, Y: 0 } => "origin",
Point { X: var x, Y: var y } => $"({x}, {y})",
_ => "unknown"
};
首先這是一個函數(shù)慨代,使用了之前C#新增的語法,表達(dá)式體函數(shù)啸如,如果一個函數(shù)直接返回一個表達(dá)式,那么就可以用箭頭=>直接替換原來的方法體氮惯。重點在于第一個箭頭后面的switch叮雳,這是一個switch表達(dá)式,o就是要測試的值妇汗,switch右面的花括號里面就是匹配列表帘不,如果o的值是(0,0)的點,就返回"origin"字符串杨箭;如果是一個普通的點寞焙,就打印該點的坐標(biāo);如果是其他情況互婿,就返回"unknown"捣郊,這里的下劃線_相當(dāng)于switch語句的default。
如果你理解了這個例子慈参,官方有給了一個更加復(fù)雜的例子呛牲,這次還帶了元組解構(gòu)的語法⊥耘洌可以看到娘扩,如果沒有switch表達(dá)式以及模式匹配,要實現(xiàn)相同的功能很明顯需要很多冗長的代碼壮锻。
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")
};
異步流
接下來一個比較重要的改進(jìn)是異步流琐旁。不過官方?jīng)]有多提,估計等到比較穩(wěn)定的時候會詳細(xì)介紹猜绣。
IEEE浮點數(shù)改進(jìn)
浮點數(shù)系統(tǒng)也根據(jù)IEEE 754-2008修訂版進(jìn)行了改進(jìn)以遵循規(guī)定灰殴。還增加了一下一些數(shù)學(xué)API:
- BitIncrement/BitDecrement
- MaxMagnitude/MinMagnitude
- ILogB
- ScaleB
- Log2
- FusedMultiplyAdd
- CopySign
內(nèi)置JSON Writer和Json Document
現(xiàn)在.NET Core內(nèi)置了JSON Writer和Json Document類,方便大家使用掰邢。該類按照官方博客稱比Json.NET快30%-80%验懊,不過由于內(nèi)置的JSON類偏底層一些,平時大家用的肯定還是Json.NET尸变,不過如果你想自己做一些功能义图,就可以利用官方的底層類來實現(xiàn)。
下面是官方的一個實例:
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互操作等等進(jìn)行了支持和改進(jìn)碱工,這里就不一一介紹了。相信再過不久,.NET Core 3就能正式和大家見面了怕篷。