日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

.NET8 正式發(fā)布, C#12 新變化

來源: 責編: 時間:2023-11-17 17:14:44 295觀看
導讀在 .NET Conf 2023 大會上,.NET 8 正式發(fā)布了,.NET 8 是一個長期支持(LTS)版本,這意味著可以獲得三年的支持和補丁。我們也計劃將框架從 .NET Core3.1 升級到 8 ,關于如何升級等升級完成后再來分享。要使用 .NET 8 ,需要

3tZ28資訊網(wǎng)——每日最新資訊28at.com

在  .NET Conf  2023  大會上,.NET 8 正式發(fā)布了,.NET 8 是一個長期支持(LTS)版本,這意味著可以獲得三年的支持和補丁。我們也計劃將框架從 .NET Core3.1 升級到 8 ,關于如何升級等升級完成后再來分享。3tZ28資訊網(wǎng)——每日最新資訊28at.com

要使用 .NET 8 ,需要安裝相關的 SDK,可以在這個地址進行下載:https://dotnet.microsoft.com/zh-cn/download/dotnet/8.0,或者將 VS2022 升級到 17.8 。3tZ28資訊網(wǎng)——每日最新資訊28at.com

雖然 8 又帶來了很多方面的增強,比如:人工智能、云原生、性能、native AOT  等,但我還是最關注  C# 語言和一些框架層面的變化,下面介紹下 C# 12 和框架中的我認為比較實用的新增功能,全部更新說明可以看官方文檔:https://learn.microsoft.com/zh-cn/dotnet/core/whats-new/dotnet-8 。3tZ28資訊網(wǎng)——每日最新資訊28at.com

序列化增強

其他類型的內置支持

  • 可以對附加類型:Half、Int128、UInt128 進行序列化,在 .NET 7 中對這些類型序列化時不會報錯,但內容不能正常獲取。
  • 可以對 ReadOnlyMemory、Memory類型進行序列化。
  • 當  T  的類型為  byte  時,序列化結果為  base64,否則為  json 數(shù)組。
using System.Text.Json;//輸出:[65500,170141183460469231731687303715884105727,340282366920938463463374607431768211455]Console.WriteLine(JsonSerializer.Serialize(new object[] { Half.MaxValue, Int128.MaxValue, UInt128.MaxValue }));//輸出:"AQIDBAUG"Console.WriteLine(JsonSerializer.Serialize<ReadOnlyMemory<byte>>(new byte[] { 1,2,3,4,5,6}));//輸出:[1,2,3]Console.WriteLine(JsonSerializer.Serialize<Memory<int>>(new int[] { 1, 2, 3 }));

接口層次結構

IDerived value = new DerivedImplement { Base = 0, Derived = 1 };Console.WriteLine(JsonSerializer.Serialize(value));//輸出:{"Base":0,"Derived":1}public interface IBase{    public int Base { get; set; }}public interface IDerived : IBase{    public int Derived { get; set; }}public class DerivedImplement : IDerived{    public int Base { get; set; }    public int Derived { get; set; }}

上面代碼中 IDerived 接口繼承了 IBase 接口后,就擁有兩個屬性了。3tZ28資訊網(wǎng)——每日最新資訊28at.com

在之前的版本(3.1、6、7)中使用包含兩個屬性的接口 IDerived 來接收對象的實例化,然后進行序列化,得到的結果只有:{Derived":1} ,繼承過來的屬性 Base 不能被識別。3tZ28資訊網(wǎng)——每日最新資訊28at.com

在 8 中得到了改進,可以得到期望的結果,值得注意的是,如果之前使用了變通方式來進行處理,升級后需要有針對性進行測試和調整。3tZ28資訊網(wǎng)——每日最新資訊28at.com

命名策略

下圖是 8  中序列化時對命名策略的支持:3tZ28資訊網(wǎng)——每日最新資訊28at.com

3tZ28資訊網(wǎng)——每日最新資訊28at.com

在之前的版本:3.1、6、7  中都只支持 CamelCase 。在  8  中新增的策略如下:3tZ28資訊網(wǎng)——每日最新資訊28at.com

  • KebabCaseLower:小寫中劃線,例如:user-name。
  • KebabCaseUpper:大寫中劃線,例如:USER-NAME。
  • SnakeCaseLower:小寫中劃線,例如:user_name。
  • SnakeCaseUpper:大寫中劃線,例如:USER_NAME。
var options1 = new JsonSerializerOptions{    PropertyNamingPolicy = JsonNamingPolicy.KebabCaseLower,};var options2 = new JsonSerializerOptions{    PropertyNamingPolicy = JsonNamingPolicy.KebabCaseUpper,};var options3 = new JsonSerializerOptions{    PropertyNamingPolicy = JsonNamingPolicy.SnakeCaseLower,};var options4 = new JsonSerializerOptions{    PropertyNamingPolicy = JsonNamingPolicy.SnakeCaseUpper,};Console.WriteLine(JsonSerializer.Serialize(new UserInfo() { UserName = "oec2003" }, options1));Console.WriteLine(JsonSerializer.Serialize(new UserInfo() { UserName = "oec2003" }, options2));Console.WriteLine(JsonSerializer.Serialize(new UserInfo() { UserName = "oec2003" }, options3));Console.WriteLine(JsonSerializer.Serialize(new UserInfo() { UserName = "oec2003" }, options4));public class UserInfo{    public string? UserName { get; set; }}

結果如下:3tZ28資訊網(wǎng)——每日最新資訊28at.com

3tZ28資訊網(wǎng)——每日最新資訊28at.com

調用 API 直接獲取到對象

現(xiàn)在有一個接口返回如下圖中的數(shù)據(jù):3tZ28資訊網(wǎng)——每日最新資訊28at.com

3tZ28資訊網(wǎng)——每日最新資訊28at.com

如果是在 8 以前的版本中獲取該接口的數(shù)據(jù),需要先獲取到接口內容,然后進行反序列化,代碼如下:3tZ28資訊網(wǎng)——每日最新資訊28at.com

const string RequestUri = "http://localhost:5145/user";using var client = new HttpClient();var stream =await client.GetStreamAsync(RequestUri);//反序列化var users = JsonSerializer.DeserializeAsyncEnumerable<UserInfo>(stream);await foreach(UserInfo user in users){    Console.WriteLine($"姓名:{user.userName}");}Console.ReadKey();public record UserInfo(string userName);

在版本 8  中可以直接調用 GetFromJsonAsAsyncEnumerable 方法直接得到對象,無需進行反序列化:3tZ28資訊網(wǎng)——每日最新資訊28at.com

const string RequestUri = "http://localhost:5145/user";using var client = new HttpClient();IAsyncEnumerable<UserInfo> users = client.GetFromJsonAsAsyncEnumerable<UserInfo>(RequestUri);await foreach (UserInfo user in users){    Console.WriteLine($"姓名: {user.userName}");}Console.ReadKey();public record UserInfo(string userName);

上面兩種代碼的結果一樣,如下圖:3tZ28資訊網(wǎng)——每日最新資訊28at.com

3tZ28資訊網(wǎng)——每日最新資訊28at.com

隨機數(shù)增強

在 8 中對隨機數(shù)類 Random 提供了 GetItems() 方法,可以根據(jù)指定的數(shù)量在提供的一個集合中隨機抽取數(shù)據(jù)項生成一個新的集合:3tZ28資訊網(wǎng)——每日最新資訊28at.com

ReadOnlySpan<string> colors = new[]{"Red","Green","Blue","Black"};string[] t1 = Random.Shared.GetItems(colors, 10);Console.WriteLine(JsonSerializer.Serialize(t1));//輸出:["Black","Green","Blue","Blue","Green","Blue","Green","Black","Green","Blue"]//每次都會不一樣Console.ReadKey();

通過 Random 提供的 Shuffle() 方法,可以將一個集合中的數(shù)據(jù)項的順序打亂:3tZ28資訊網(wǎng)——每日最新資訊28at.com

string[] colors = new[]{"Red","Green","Blue","Black"};Random.Shared.Shuffle(colors);Console.WriteLine(JsonSerializer.Serialize(colors));Console.ReadKey();

新增的提高性能的類型

新增了 FrozenDictionary<TKey,TValue> 和 FrozenSet,這兩個類型在 System.Collections.Frozen 命名空間下,創(chuàng)建這兩種類型的集合后,就不允許對鍵和值進行任何更改,因此可以實現(xiàn)更快的讀取操作。3tZ28資訊網(wǎng)——每日最新資訊28at.com

下面是使用 BenchmarkDotNet  對 FrozenDictionary 和 Dictionary 進行測試的代碼:3tZ28資訊網(wǎng)——每日最新資訊28at.com

BenchmarkRunner.Run<FrozenDicTest>();Console.ReadKey();[SimpleJob(RunStrategy.ColdStart, iterationCount:5)]public class FrozenDicTest{    public static Dictionary<string, string> dic = new() {        { "name1","oec2003"},        { "name2","oec2004"},        { "name3","oec2005"}    };    public static FrozenDictionary<string, string> fdic = dic.ToFrozenDictionary();    [Benchmark]    public void TestDic()    {        for (int i = 0; i < 100000000; i++)        {            dic.TryGetValue("name", out _);        }    }    [Benchmark]    public void TestFDic()    {        for (int i = 0; i < 100000000; i++)        {            fdic.TryGetValue("name", out _);        }    }}

從測試結果看,效果還是很明顯的:3tZ28資訊網(wǎng)——每日最新資訊28at.com

3tZ28資訊網(wǎng)——每日最新資訊28at.com

新增的 System.Buffers.SearchValues類,可以用來進行字符串的查找和匹配,相比較  string  類型的操作,性能有大幅提升,下面還是用 BenchmarkDotNet 進行測試:3tZ28資訊網(wǎng)——每日最新資訊28at.com

BenchmarkRunner.Run<SearchValuesTest>();Console.ReadKey();[SimpleJob(RunStrategy.ColdStart, iterationCount: 5)]public class SearchValuesTest{    [Benchmark]    public void TestString()    {        var str = "!@#$%^&*()_1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";        for (int i = 0; i < 100000000; i++)        {            str.Contains("z");        }    }    [Benchmark]    public void TestSearchValues()    {        var sv = SearchValues.Create("!@#$%^&*()_1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"u8);        byte b = (byte)"z"[0];        for (int i = 0; i < 100000000; i++)        {            sv.Contains(b);        }    }}

從運行結果看,有大約 5 倍的的提升:3tZ28資訊網(wǎng)——每日最新資訊28at.com

3tZ28資訊網(wǎng)——每日最新資訊28at.com

依賴注入增強

在 8 之前的版本中,依賴注入寫法如下:3tZ28資訊網(wǎng)——每日最新資訊28at.com

var builder = WebApplication.CreateBuilder(args);builder.Services.AddTransient<IUser, UserA>(); var app = builder.Build();app.MapGet("/user", (IUser user) =>{    return $"hello , {user.GetName()}";});app.Run();internal interface IUser{    string GetName();}internal class UserA: IUser{    public string GetName() => "oec2003";}

如果 IUser 接口有兩個實現(xiàn),上面代碼中的寫法就只能獲取到最后一個注冊類的實例,要實現(xiàn)一個接口多個實現(xiàn)類的注入,還需要寫一些額外的代碼,比較繁瑣。3tZ28資訊網(wǎng)——每日最新資訊28at.com

版本 8 中添加了注入關鍵字,可以很方便實現(xiàn),看下面代碼:3tZ28資訊網(wǎng)——每日最新資訊28at.com

var builder = WebApplication.CreateBuilder(args);builder.Services.AddKeyedSingleton<IUser, UserA>("A");builder.Services.AddKeyedSingleton<IUser, UserB>("B");var app = builder.Build();app.MapGet("/user1", ([FromKeyedServices("A")] IUser user) =>{    return $"hello , {user?.GetName()}";});app.MapGet("/user2", ([FromKeyedServices("B")] IUser user) =>{    return $"hello , {user?.GetName()}";});app.Run();internal interface IUser{    string GetName();}internal class UserA: IUser{    public string GetName() => "oec2003";}internal class UserB : IUser{    public string GetName() => "oec2004";}

本文鏈接:http://www.www897cc.com/showinfo-26-27991-0.html.NET8 正式發(fā)布, C#12 新變化

聲明:本網(wǎng)頁內容旨在傳播知識,若有侵權等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 帶你吃透Kafka的可靠性設計

下一篇: null 不好,我推薦你使用 Optional

標簽:
  • 熱門焦點
  • JavaScript 混淆及反混淆代碼工具

    介紹在我們開始學習反混淆之前,我們首先要了解一下代碼混淆。如果不了解代碼是如何混淆的,我們可能無法成功對代碼進行反混淆,尤其是使用自定義混淆器對其進行混淆時。什么是混
  • 企業(yè)采用CRM系統(tǒng)的11個好處

    客戶關系管理(CRM)軟件可以為企業(yè)提供很多的好處,從客戶保留到提高生產(chǎn)力。  CRM軟件用于企業(yè)收集客戶互動,以改善客戶體驗和滿意度。  CRM軟件市場規(guī)模如今超過580
  • 如何使用JavaScript創(chuàng)建一只圖像放大鏡?

    譯者 | 布加迪審校 | 重樓如果您曾經(jīng)瀏覽過購物網(wǎng)站,可能遇到過圖像放大功能。它可以讓您放大圖像的特定區(qū)域,以便瀏覽。結合這個小小的重要功能可以大大改善您網(wǎng)站的用戶體驗
  • 微軟邀請 Microsoft 365 商業(yè)用戶,測試視頻編輯器 Clipchamp

    8 月 1 日消息,微軟近日宣布即將面向 Microsoft 365 商業(yè)用戶,開放 Clipchamp 應用,邀請用戶通過該應用來編輯視頻。微軟于 2021 年收購 Clipchamp,隨后開始逐步整合到 Microsof
  • 重估百度丨“晚熟”的百度云,能等到春天嗎?

    &copy;自象限原創(chuàng)作者|程心排版|王喻可2016年7月13日,百度云計算戰(zhàn)略發(fā)布會在北京舉行,宣告著百度智能云的正式啟程。彼時的會場座無虛席,甚至排隊排到了門外,在場的所有人幾乎都
  • 猿輔導與新東方的兩種“歸途”

    作者|卓心月 出品|零態(tài)LT(ID:LingTai_LT)如何成為一家偉大企業(yè)?答案一定是對&ldquo;勢&rdquo;的把握,這其中最關鍵的當屬對企業(yè)戰(zhàn)略的制定,且能夠站在未來看現(xiàn)在,即使這其中的
  • 一條抖音4億人圍觀 ! 這家MCN比無憂傳媒還野

    作者:Hiu 來源:互聯(lián)網(wǎng)品牌官01 擦邊少女空降熱搜,幕后推手曝光被網(wǎng)友譽為&ldquo;純欲天花板&rdquo;的女網(wǎng)紅井川里予,近期因為一組哥特風照片登上熱搜,引發(fā)了一場互聯(lián)網(wǎng)世界關于
  • 網(wǎng)傳小米汽車開始篩選交付中心 建筑面積不低于3000平方米

    7月7日消息,近日有微博網(wǎng)友@長三角行健者爆料稱,據(jù)經(jīng)銷商集團反饋,小米汽車目前已經(jīng)開始了交付中心的篩選工作,要求候選場地至少有120個車位,建筑不能低
  • 榮耀Magic4 至臻版 首創(chuàng)智慧隱私通話 強勁影音系統(tǒng)

    2022年第一季度臨近尾聲,在該季度內,許多品牌陸續(xù)發(fā)布自己的最新產(chǎn)品,讓大家從全新的角度來了解當今的手機技術。手機是電子設備中,更新迭代十分迅速的一款產(chǎn)品,基
Top 主站蜘蛛池模板: 昔阳县| 青浦区| 荥经县| 铜梁县| 东源县| 湖南省| 衡山县| 溆浦县| 崇仁县| 二连浩特市| 自治县| 黑山县| 城固县| 蚌埠市| 米泉市| 田林县| 荃湾区| 定远县| 临颍县| 宁蒗| 琼结县| 准格尔旗| 乐业县| 威远县| 财经| 昌平区| 汕尾市| 丹巴县| 宜君县| 昭觉县| 巩义市| 平乐县| 兖州市| 五华县| 应用必备| 枣强县| 贵州省| 七台河市| 寿阳县| 赣州市| 青冈县|