更快,更強的.NET 7 發布了

bf1012833400b09b051d73ca83839241.png

.NET Conf 2022 在昨晚(11?8?) 11 點 正式開始了,為期三天的會議(11?8-10?), 圍繞 .NET 7 展開。相信各位?伙伴都已經開始安裝 .NET 7 正式版本還有以及相關的開發?具。這次 .NET 7 圍繞傳統的 C# ,ASP.NET Core , Blazor , .NET MAUI , 云原?等內容進行了更新。下面歸類總結?下我比較關心的更新內容,希望能給各位?伙伴?個快速的介紹。

1

C# 11 新增的六大功能

1. 泛型屬性 - Generic attributes

泛型是編程語?的一種風格。讓程序員在強類型程序設計語?中編寫代碼使??些以后才指定的類型。C# 在2.0 開始?持泛型,C# 版本更替時不斷對泛型的?持進?了增強和補充。在 C# 11 中,增加了泛型屬性。

這是?段 ASP.NET 的代碼,每個字段都有?些要求屬性,如必填的字段,限制范圍,以及對應的類型等

public class Movie
{
public int Id { get; set; }
[Required]
[StringLength(100)]
public string Title { get; set; } = null!;
[ClassicMovie(1960)]
[DataType(DataType.Date)]
[Display(Name = "Release Date")]
public DateTime ReleaseDate { get; set; }
[Required]
[StringLength(1000)]
public string Description { get; set; } = null!;
[Range(0, 999.99)]
public decimal Price { get; set; }
public Genre Genre { get; set; }
public bool Preorder { get; set; }
}

你可以通過 System.Attribute 派?出不同的屬性。

在 C# 11 之前你也可以去做泛型屬性的定義,通過 System.Type 在?定義屬性類中作為構造函數的參數進?傳遞。

[AttributeUsage(AttributeTargets.Class)]
public class Conditions: Attribute
{
public Conditions(Type t)
{
ParamType = t;
}
public Type ParamType { get; }
}

實現

[Conditions(typeof(string))]
public class Player
{
public string Number { get; set; }
public string Name { get; set; }
}

? C# 11 增加了對泛型屬性的支持。直接定義?個泛型類,不?再將 System.Type 作為參數傳遞給構造函數。而且可以有?個或者多個類型作為參數, ?且類型安全性也增加了。

[AttributeUsage(AttributeTargets.Class)]
public class Conditions<T>: Attribute
where T : class
{
public Conditions()
{
}
public T ParamType { get; }
}
[Conditions<string>()]
public class Player
{
public string Number { get; set; }
public string Name { get; set; }
}

因為有了泛型類的加持,您可以在類型參數上靈活添加不同的條件約束。

2. 原始字符串 - New Raw string literals

在定義字符串時,我們往往夾雜著很多的符號,換?還有空格,但過往這些都需要增加轉移字符,但現在通過原始字符串可以讓字符串定義更為簡單,也更容易給?接受。

string?longMessage?=?"""This is a long message.It has several lines.Some are indentedmore than others.Some should start at the first column.Some have "quoted text" in them.""";

3. 列表模式 - List patterns

從 C# 11 開始,可以將數組或列表與模式的序列進?匹配,如以下示例所示:

int[] numbers = { 1, 2, 3 };
Console.WriteLine(numbers is [1, 2, 3]); // True
Console.WriteLine(numbers is [1, 2, 4]); // False
Console.WriteLine(numbers is [1, 2, 3, 4]); // False
Console.WriteLine(numbers is [0 or 1, <= 2, >= 3]); // True

這個雖然看似是語法糖,但是對于?些數據處理的場景時?常有?的,例如 CSV或者事固定?度的?件數。

4. 字符串插值中的換?符 - Newlines in string interpolations

以前,字符串插值 {text} 的?本只允許??。現在在 C# 11 中,此?本可以允許多?。$ 特殊字符將字符串?本標識為內插字符串 。內插字符串是可能包含內插表達式的字符串?本 。將內插字符串解析為結果字符串時,帶有內插表達式的項會替換為表達式結果的字符串表示形式。

string message = $"The usage policy for {safetyScore} is {safetyScore switch{> 90 => "Unlimited usage",> 80 => "General usage, with daily safety check",> 70 => "Issues must be addressed within 1 week",> 50 => "Issues must be addressed within 1 day",_ => "Issues must be addressed before continued use",}}";

5. 改進方法組轉換為委托 - Method Group conversion to Delegate

委托?于將?法作為參數傳遞給其他?法。最常見的委托是 Action、Func 和 EventHandler。您可以使?lambda 表達式來提供委托,也可以使??法組。您還可以將委托緩存到?個字段中,并在需要時重?該實例。

例如這個就是我們經常使?的定義

void ActionDelegetDemo(Func<string> action) { }
string GetPlayer() => "";

在 C# 11 之前 我們通過方法組進行委托的調用,如

ActionDelegetDemo(GetPlayer);
ActionDelegetDemo(new Func<string>(GetPlayer));

在 C# 11 后,你可以通過沒有閉包的 Lamda / ?法中去實現

ActionDelegetDemo(()?=>?GetPlayer());

也可以通過?動委托的?式來實現

static?readonly?Func<string>?Instance?=?new?Func<string>(GetPlayer);
ActionDelegetDemo(Instance);

6. 接口中的靜態抽象成員 - Static Abstract Members in Interfaces

C# 11 和 .NET 7 包括接?中的靜態抽象成員。它可定義重載運算符或其他靜態成員的接?。使?靜態成員定義接口后,可使?這些接?作為約束來創建使?運算符或其他靜態?法的泛型類型。通過將 static 和abstract 修飾符添加到不提供實現的任何靜態成員,如

public interface IGetNext<T> where T : IGetNext<T>
{
static abstract T operator ++(T other);
}

這個功能在泛型處理是?常?便的,我們可以在接?中包含靜態抽象成員,然后我們可以對泛型?法指定?個約束,即類型參數應該從這個特定的接?派?。?旦完成,泛型?法就可以輕松調?靜態?法。

2

Native AOT 來了

如果你是傳統的 Xamarin 開發者,你肯定對 AOT 技術不陌生,因為有 Mono AOT , ?針對客戶端場景和服務器場景也有 ReadyToRun。Native AOT 技術可以將 .NET 應?程序編譯成本機可執??件 ,也還可以?成獨?的動態或靜態庫從?給其他編程語?調?。Native AOT 應?程序啟動速度?常快,?且對于內存的使?也是?常?的。你可以在沒有 .NET 運?時的設備上直接運? Native AOT 的應?。Native AOT不使用 JIT 編譯器,所以它可以在 JIT 受限制的環境中運?。它可以在 Arm64 / x64 的環境下運?。這個或者讓?家想到了 Rust ,也想到了 Go。現階段,.NET 7 的 Native AOT ?常受限只有控制臺和?些庫文件?持。但這是第一步,希望各位?伙伴也能盡量去嘗試。

如果你要創建?個 Native AOT 的應?,需要在 csproj ?件中添加:

<PropertyGroup><PublishAot>true</PublishAot>
</PropertyGroup>

你也可以針對 Linux 或者 Windows arm / x64 編譯 Native AOT 應?,例如

dotnet?publish?-r?linux-arm64?-c?Release

注意在 Ubuntu 環境下 , 你需要添加以下的?些庫 clang zlib1g-dev

sudo?apt-get?install?clang?zlib1g-de

現在 Native AOT 還是?較受限,我更期待能?持?下 MAUI , 這樣是不是路更?。還有我使? Native AOT編譯出來的應?過?,是否需要考慮壓縮?下呢 ?我能理解它是增量的,但是?個 HelloWorld 應?也?得有點夸張了。希望它能越來越好。

3

端技術改進

.NET MAUI 是?道坎,或者很多?伙伴希望它能做更多。有?會希望性能有所提升,有?希望能在 Linux 上得到?持,也有?希望 IDE 能夠完善?點。我?直和 .NET MAUI 的團隊保持溝通,也希望盡快能實現各位?伙伴的愿望。在 .NET 7 中,.NET MAUI 在桌?應?的?持有了很多的改善。在?勢,在桌?菜單,以及對?標?持,右鍵菜單,窗體縮放都有很好的?持。或者期望更多了。這不是最好的更新,但是這是更穩定的跨平臺應?開發。我們在期待更?更新的時候,更應該開始著?投?到 .NET MAUI 的應?開發中來了,

4cea11b27d770a2be9e8f8809db666b9.png

b302c815577cd71c3057a9fe3f87ab75.png

開發體驗上 .NET MAUI 已經?持 iOS 16 和 Android 13 了, 這也解決了 Xcode 14 不兼容的問題。與時俱進是我喜歡 .NET MAUI 的原因。還有 Hot Reload 也有了?個進化,?持 .NET for iOS 和 .NET for Android 以及Blazor WebAssembly 了。

說完 .NET MAUI , 說到端應?不能不提及 Blazor . 這?年 Blazor 的應?持續攀升,這也得益于一個好的性能以及 WebAssembly 技術 的發展。我個?很喜歡WebAssembly。.NET 7 為基于 JavaScript 的應?中的WebAssembly 上運? .NET 提供了改進的支持,包括豐富的 JavaScript 互操作機制。.NET 7 中的WebAssembly ?持是基于 Blazor WebAssembly 應?程序,但也可以獨?于 Blazor 使?。現有的JavaScript 應?程序可以使? .NET 7 中擴展的 WebAssembly ?持來重? JavaScript 中的 .NET 庫或構建全新的基于 .NET 的應?。Blazor WebAssembly 應?程序還可以使?新的 JavaScript 互操作機制來優化與JavaScript 和 Web 平臺的交互。

各位?伙伴在安裝好 .NET 7 后可以在命令?中通過 workload 添加 wasm 的?持

dotnet workload install wasm-tools
dotnet workload install wasm-experimental

添加完成后,你就可以通過創建你的 wasm 應?

dotnet new wasmbrowser

還有也有了 AOT 的?持,通過 AOT 你可以提升運?速度,通過修改 csproj ?件就可以獲取 AOT ?持

<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><TargetFramework>net7.0</TargetFramework><WasmMainJSPath>main.js</WasmMainJSPath><OutputType>Exe</OutputType><Nullable>enable</Nullable><AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+                <PublishTrimmed>true</PublishTrimmed>
+                <TrimMode>full</TrimMode>
+                <RunAOTCompilation>true</RunAOTCompilation></PropertyGroup>
</Project>

發布也?常簡單

dotnet publish -c Release

?且還?持在本地托管發布應?

dotnet tool install --global dotnet-serve
dotnet serve --mime .wasm=application/wasm --mime .js=text/javascript --
mime .json=application/json --directory bin\Release\net7.0\browserwasm\
AppBundle\

4

ML.NET 2.0 發布

? .NET 做機器學習,很多?會打?個問號。但微軟就是要把 .NET 可以做機器學習的問號變成了嘆號。ML.NET 在 1.5 后,特別是 ML.NET CLI 已經?常好?,特別是AutoML 這塊。在 ML.NET 2.0 對于?然語?這塊的處理都有?常?的改進。這得益于 TorchSharp 的改進。或者是受TensorFlow.NET 的影響, ?家?持的 TorchSharp 也有了很?的進步。

?然語?是?常常?的問題, ML.NET 新增加了?本分類的 API ,讓開發者通過少量的代碼就可以完成?本分類,情感分析,以及摘要提取等?作。具體的 API 封裝如下

7e427a21254480739968dbb237a3c987.png

你可以理解為 ML.NET 幫你完成了 80% 的?作,包括最復雜的?然語?算法構建等?作,你需要做的就是提供數據, 和相關 API 的調?。這是官?的?個示例

using Microsoft.ML;
using Microsoft.ML.TorchSharp;
var mlContext = new MLContext();
var reviews = new[]
{
new {Text = "This is a bad steak", Sentiment = "Negative"},
new {Text = "I really like this restaurant", Sentiment = "Positive"}
};
var reviewsDV = mlContext.Data.LoadFromEnumerable(reviews);
var pipeline =
mlContext.Transforms.Conversion.MapValueToKey("Label",
"Sentiment")
.Append(mlContext.MulticlassClassification.Trainers.TextClassification(num
berOfClasses: 2, sentence1ColumnName: "Text"))
.Append(mlContext.Transforms.Conversion.MapKeyToValue("PredictedLabel"));
// Train the model
var model = pipeline.Fit(reviewsDV);

我們可以看到?常簡潔,并不需要很多的機器學習/深度學習知識,這也讓更多 .NET 開發者能更快使?ML.NET 到項?中來。

5

小結

.NET 7 在 .NET 6 基礎上做了加?的操作,讓 .NET 朝著更好的???邁進了?步。對于眾多 .NET 開發者??,我們會繼續擁抱 .NET , 當然也希望有更多的?加?到 .NET 的開發?家庭中來。.NET 7 并不是終點,每次版本的發布都是?個重新的起點。希望 .NET 越來越好。

ps :這次 .NET Conf 2022 不僅有 .NET 7 , 官?也更新了,更加直觀好?,?家快快上去看看

c3a909895fa2ce9c70e3217fa10ba9ba.png

最后希望?家記得?持我在 11? 10 ? 北京時間下午 13:30-14:00關于.NET做深度學習的課程。

9d4fd59d87572f795c2244c5829849fe.png

相關文檔

1. 訪問 .NET 中?官??

https://dotnet.microsoft.com/zh-cn/

2.下載最新的 .NET 7?

https://dotnet.microsoft.com/en-us/download/dotnet/7.0

3.了解 C# 11?

https://learn.microsoft.com/dotnet/csharp/whats-new/csharp-11/?

wt.mc_id=ICX_dontnet22

4.了解 F# 6?

https://learn.microsoft.com/zh-cn/dotnet/fsharp/whats-new/fsharp-6?wt.mc_id=ICX_dontnet22

5.了解 .NET MAUI?

https://learn.microsoft.com/zh-cn/dotnet/maui/what-is-maui?

wt.mc_id=ICX_dontnet22

6.了解.NET 微服務相關內容 https://learn.microsoft.com/dotnet/architecture/microservices/?

wt.mc_id=ICX_dontnet22

7.了解 .NET Native AOT 技術?

https://learn.microsoft.com/en-us/dotnet/core/deploying/native-aot/?

wt.mc_id=ICX_dontnet22

8.了解 Blazor?

https://learn.microsoft.com/zh-cn/aspnet/core/blazor/?wt.mc_id=ICX_dontnet22

CA周記往期回顧:

7e1ad6a3b3d81b7841b1be87e3667170.jpeg

更多原創文章與資源共享

請關注Kinfey Techtalk

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/281246.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/281246.shtml
英文地址,請注明出處:http://en.pswp.cn/news/281246.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Web服務器 - Nginx配置介紹

nginx的配置相對簡單&#xff0c;總體來說分為5種模塊 全局塊&#xff1a;配置影響nginx全局的指令。一般有運行nginx服務器的用戶組&#xff0c;nginx進程pid存放路徑&#xff0c;日志存放路徑&#xff0c;配置文件引入&#xff0c;允許生成worker process數等。events塊&…

jvm(Java virtual machine) JVM架構解釋

2019獨角獸企業重金招聘Python工程師標準>>> JVM 架構解釋 每個Java開發者都知道通過JRE【Java運行環境】執行字節碼。 但是很多人都不知道JRE是JVM實現的事實。JVM負責執行字節碼的分析 代碼的解釋和運行。 我們應該了解JVM的架構&#xff0c;這對開發者來說是很重…

Hyper-V 嵌套虛擬化

先決條件運行 Windows Server 2016 或Windows 10 周年更新的 Hyper-V 主機。運行 Windows Server 2016 或Windows 10 周年更新的 Hyper-V VM。配置版本為 8.0 或更高的 Hyper-V VM。采用 VT-x 和 EPT 技術的 Intel 處理器&#xff08;AMD-V技術的暫時不支持&#xff09;>Set…

簡單的面試題簡解思路(搜集)

1. 統計字符串中單詞出現次數 "hi how are you i am fine thank you youtube am am "&#xff0c;統計"you"出現的次數。 方法一 : split() function wordCount(str,word){var str str || "";var word word || "";var strArr s…

WinForm(十五)窗體間通信

在很多WinForm的程序中&#xff0c;會有客戶端之間相互通信的需求&#xff0c;或服務端與客戶端通信的需求&#xff0c;這時就要用到TCP/IP的功能。在.NET中&#xff0c;主要是通過Socket來完成的&#xff0c;下面的例子是通過一個TcpListerner作為監聽&#xff0c;等待TcpClie…

905. 按奇偶排序數組

1// 905. 按奇偶排序數組 2/** 3 * param {number[]} A 4 * return {number[]} 5 */ 6var sortArrayByParity function(A) { 7 return A.filter(value > value % 2 0).concat( 8 A.filter(value > value % 2 1) 9 )10}; 轉載于:https://www.cnblogs.com/…

關于Java開發需要注意的十二點流程

1.將一些需要變動的配置寫在屬性文件中 比如&#xff0c;沒有把一些需要并發執行時使用的線程數設置成可在屬性文件中配置。那么你的程序無論在DEV環境中&#xff0c;還是TEST環境中&#xff0c;都可以順暢無阻地運行&#xff0c;但是一旦部署在PROD上&#xff0c;把它作為多線…

Unity經典游戲教程之:雪人兄弟

版權聲明&#xff1a; 本文原創發布于博客園"優夢創客"的博客空間&#xff08;網址&#xff1a;http://www.cnblogs.com/raymondking123/&#xff09;以及微信公眾號"優夢創客"&#xff08;微信號&#xff1a;unitymaker&#xff09;您可以自由轉載&#x…

使用webpack搭建個性化項目

安裝主包 yarn add webpack webpack-cli webpack-dev-server -D根據項目實際需求安裝loaders&#xff0c;webpack-loaders列表 根據項目實際需求安裝插件&#xff0c; webpack-plugins列表 常用包列表 包名說明webpackwebpack主程序&#xff0c;配置列表webpack-cliwebpack…

.NET周報【11月第1期 2022-11-07】

國內文章開源安全賦能 - .NET Conf China 2022https://mp.weixin.qq.com/s/_tYpfPeQgyEGsnR4vVLzHg.NET Conf China 2022 是面向開發人員的社區峰會&#xff0c;延續 .NET Conf 2022 的活動&#xff0c;慶祝 .NET 7 的發布和回顧過去一年來 .NET 在中國的發展成果&#xff0c;它…

React - 狀態提升

從入門的角度來聊一下React 的狀態提升。我們先來看一下React官網是怎么介紹這一概念的&#xff1a;使用 react 經常會遇到幾個組件需要共用狀態數據的情況。這種情況下&#xff0c;我們最好將這部分共享的狀態提升至他們最近的父組件當中進行管理。很簡單的一句介紹&#xff0…

saltstack(三) --- salt-httpapi

以下操作均在master上操作 1. 安裝api netapi modules&#xff08;httpapi&#xff09;有三種&#xff0c;分別是rest_cherrypy、rest_tornado、rest_wsig&#xff0c;接下來要講的是rest_cherrypydoc&#xff1a;https://docs.saltstack.com/en/latest/ref/netapi/all/salt.ne…

c++實現二叉搜索樹

自己實現了一下二叉搜索樹的數據結構。記錄一下&#xff1a; #include <iostream>using namespace std;struct TreeNode{int val;TreeNode *left;TreeNode *right;TreeNode(int value) { valvalue; leftNULL; rightNULL; } };class SearchTree{public:SearchTree();~Sear…

一款自用的翻譯小工具,開源了

一款自用的翻譯小工具&#xff0c;開源了TranslationTool作者&#xff1a;WPFDevelopersOrg - 唐宋元明清|驚鏵原文鏈接&#xff1a;https://github.com/Kybs0/TranslationTool此項目使用WPF MVVM開發。框架使用大于等于.NET461。Visual Studio 2019。最初是支持以下&#xff1…

JS使用按位異或方式加密字符串

按位異或加密字符串&#xff0c;字符串加解密都是該函數 缺陷是加密密鑰使用的字符最好不要出現需要加密的字符串中的字符&#xff0c;一旦出現原字符與加密字符一樣額情況&#xff0c;異或結果為0&#xff0c;導致不能還原字符串&#xff0c;可以考慮更改算法避免這種情況 im…

SCSS 實用知識匯總

1、變量聲明 $nav-color: #F90; nav {//$width 變量的作用域僅限于{}內$width: 100px;width: $width;color: $nav-color; }.a {//報錯&#xff0c;$width未定義width: $width; } 2、父選擇器& scss代碼&#xff1a; article a {color: blue;&:hover { color: red } } 編…

【ELK集群+MQ】通用部署方案以及快速實現MQ發布訂閱服務功能

前言&#xff1a;大概一年多前寫過一個部署ELK系列的博客文章&#xff0c;前不久剛好在部署一個ELK的解決方案&#xff0c;我順便就把一些基礎的部分拎出來&#xff0c;再整合成一期文章。大概內容包括&#xff1a;搭建ELK集群&#xff0c;以及寫一個簡單的MQ服務。如果需要看一…

python容錯

#try: except: else: #為什么叫容錯呢&#xff0c;先說說錯誤&#xff0c;這里說的錯誤并不是因為馬虎或者什么原因在腳本中留下的bug&#xff0c;這個不能容掉&#xff0c;所謂容掉就是略過這個錯誤&#xff0c;要在測試時候發現并修正&#xff0c;需要容錯的錯誤是在腳本執行…

git stash參數介紹

git stash 用于暫存工作區未提交的內容&#xff0c;便于在同時開發多個分支需要切換時保存當前分支進度。 list 語法 git stash list [<options>] &#xff0c;與git log功能類似&#xff0c;列出儲藏列表&#xff0c;options 參數可以參考git log的參數 show 語法 git …

多語言報表的改動方法

在定義上傳RTF模板的時候&#xff0c;會有一個是否可翻譯的選項&#xff0c;選擇之后。就能夠上傳xlf文件作為翻譯內容。 對于已經存在的多語言類型報表&#xff0c;稍作改動之后再上傳&#xff0c;可能會出現下面現象&#xff1a; 進程出現了“未完畢”的提示 想要改動非常eas…