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

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

.NET8 正式發布, C#12 新變化

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

GOa28資訊網——每日最新資訊28at.com

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

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

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

序列化增強

其他類型的內置支持

  • 可以對附加類型:Half、Int128、UInt128 進行序列化,在 .NET 7 中對這些類型序列化時不會報錯,但內容不能正常獲取。
  • 可以對 ReadOnlyMemory、Memory類型進行序列化。
  • 當  T  的類型為  byte  時,序列化結果為  base64,否則為  json 數組。
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 接口后,就擁有兩個屬性了。GOa28資訊網——每日最新資訊28at.com

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

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

命名策略

下圖是 8  中序列化時對命名策略的支持:GOa28資訊網——每日最新資訊28at.com

GOa28資訊網——每日最新資訊28at.com

在之前的版本:3.1、6、7  中都只支持 CamelCase 。在  8  中新增的策略如下:GOa28資訊網——每日最新資訊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; }}

結果如下:GOa28資訊網——每日最新資訊28at.com

GOa28資訊網——每日最新資訊28at.com

調用 API 直接獲取到對象

現在有一個接口返回如下圖中的數據:GOa28資訊網——每日最新資訊28at.com

GOa28資訊網——每日最新資訊28at.com

如果是在 8 以前的版本中獲取該接口的數據,需要先獲取到接口內容,然后進行反序列化,代碼如下:GOa28資訊網——每日最新資訊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 方法直接得到對象,無需進行反序列化:GOa28資訊網——每日最新資訊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);

上面兩種代碼的結果一樣,如下圖:GOa28資訊網——每日最新資訊28at.com

GOa28資訊網——每日最新資訊28at.com

隨機數增強

在 8 中對隨機數類 Random 提供了 GetItems() 方法,可以根據指定的數量在提供的一個集合中隨機抽取數據項生成一個新的集合:GOa28資訊網——每日最新資訊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() 方法,可以將一個集合中的數據項的順序打亂:GOa28資訊網——每日最新資訊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 命名空間下,創建這兩種類型的集合后,就不允許對鍵和值進行任何更改,因此可以實現更快的讀取操作。GOa28資訊網——每日最新資訊28at.com

下面是使用 BenchmarkDotNet  對 FrozenDictionary 和 Dictionary 進行測試的代碼:GOa28資訊網——每日最新資訊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 _);        }    }}

從測試結果看,效果還是很明顯的:GOa28資訊網——每日最新資訊28at.com

GOa28資訊網——每日最新資訊28at.com

新增的 System.Buffers.SearchValues類,可以用來進行字符串的查找和匹配,相比較  string  類型的操作,性能有大幅提升,下面還是用 BenchmarkDotNet 進行測試:GOa28資訊網——每日最新資訊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 倍的的提升:GOa28資訊網——每日最新資訊28at.com

GOa28資訊網——每日最新資訊28at.com

依賴注入增強

在 8 之前的版本中,依賴注入寫法如下:GOa28資訊網——每日最新資訊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 接口有兩個實現,上面代碼中的寫法就只能獲取到最后一個注冊類的實例,要實現一個接口多個實現類的注入,還需要寫一些額外的代碼,比較繁瑣。GOa28資訊網——每日最新資訊28at.com

版本 8 中添加了注入關鍵字,可以很方便實現,看下面代碼:GOa28資訊網——每日最新資訊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 正式發布, C#12 新變化

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

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

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

標簽:
  • 熱門焦點
  • 小米降噪藍牙耳機Necklace分享:聽一首歌 讀懂一個故事

    在今天下午的小米Civi 2新品發布會上,小米還帶來了一款新的降噪藍牙耳機Necklace,我們也在發布結束的第一時間給大家帶來這款耳機的簡單分享。現在大家能見到最多的藍牙耳機
  • vivo TWS Air開箱體驗:真輕 臻好聽

    在vivo S15系列新機的發布會上,vivo的最新款真無線藍牙耳機vivo TWS Air也一同發布,本次就這款耳機新品給大家帶來一個簡單的分享。外包裝盒上,vivo TWS Air保持了vivo自家產
  • 5月iOS設備好評榜:iPhone 14僅排第43?

    來到新的一月,安兔兔的各個榜單又重新匯總了數據,像安卓陣營的榜單都有著比較大的變動,不過iOS由于設備的更新換代并沒有那么快,所以相對來說變化并不大,特別是iOS好評榜,老款設
  • CSS單標簽實現轉轉logo

    轉轉品牌升級后更新了全新的Logo,今天我們用純CSS來實現轉轉的新Logo,為了有一定的挑戰性,這里我們只使用一個標簽實現,將最大化的使用CSS能力完成Logo的繪制與動畫效果。新logo
  • 一文搞定Java NIO,以及各種奇葩流

    大家好,我是哪吒。很多朋友問我,如何才能學好IO流,對各種流的概念,云里霧里的,不求甚解。用到的時候,現百度,功能雖然實現了,但是為什么用這個?不知道。更別說效率問題了~下次再遇到,
  • 拼多多APP上線本地生活入口,群雄逐鹿萬億市場

    Tech星球(微信ID:tech618)文 | 陳橋輝 Tech星球獨家獲悉,拼多多在其APP內上線了&ldquo;本地生活&rdquo;入口,位置較深,位于首頁的&ldquo;充值中心&rdquo;內,目前主要售賣美食相關的
  • 國行版三星Galaxy Z Fold5/Z Flip5發布 售價7499元起

    2023年8月3日,三星電子舉行Galaxy新品中國發布會,正式在國內推出了新一代折疊屏智能手機三星Galaxy Z Fold5與Galaxy Z Flip5,以及三星Galaxy Tab S9
  • 三星Galaxy Z Fold/Flip 5國行售價曝光 :最低7499元/12999元起

    據官方此前宣布,三星將于7月26日也就是明天在韓國首爾舉辦Unpacked活動,屆時將帶來帶來包括Galaxy Buds 3、Galaxy Watch 6、Galaxy Tab S9、Galaxy
  • iQOO 11S評測:行業唯一的200W標準版旗艦

    【Techweb評測】去年底,iQOO推出了“電競旗艦”iQOO 11系列,作為一款性能強機,該機不僅全球首發2K 144Hz E6全感屏,搭載了第二代驍龍8平臺及144Hz電競
Top 主站蜘蛛池模板: 华池县| 青海省| 林口县| 侯马市| 嘉义县| 浦县| 泰和县| 五常市| 浪卡子县| 徐水县| 嵊州市| 新巴尔虎右旗| 兰溪市| 奈曼旗| 新宁县| 阿图什市| 壶关县| 广丰县| 邹城市| 双江| 翁牛特旗| 宝丰县| 万载县| 涿鹿县| 贞丰县| 贡嘎县| 拜城县| 靖安县| 定远县| 邵阳县| 巴彦淖尔市| 海晏县| 高尔夫| 额敏县| 巴塘县| 进贤县| 泾阳县| 高陵县| 汉中市| 丰县| 日照市|