c# 路径下的最近文件夹_C#8.0的两个有趣的新特性以及gRPC
最近每天忙著跑很多地方,回家就不想動(dòng)了,沒什么心情寫東西。今天有空,稍微寫一點(diǎn)。
下文中:
關(guān)于C#語(yǔ)法特性的部分需要Visual Studio 2019支持。
關(guān)于.NET Core的部分需要安裝.NET 3.0 Preview4,低版本或許也可以但我沒實(shí)驗(yàn)。
如果要在最新版的VS2019中使用.NET 3.0,可能需要在?選項(xiàng)?-?解決方案與項(xiàng)目-?ASP.NET Core?中啟用 使用?.NET Core SDK?預(yù)覽版 選項(xiàng)。
【C# 8.0新特性:可空的引用類型】
static復(fù)制以上簡(jiǎn)單的代碼到IDE就能展現(xiàn)這個(gè)特性的特點(diǎn)與用法:
IDE會(huì)對(duì)?a?賦值為?null?的操作進(jìn)行警告, 因?yàn)樵诩s定中?a?不可為空,而?b?則不會(huì)警告,因?yàn)樗梢詾?null?;
IDE會(huì)對(duì)?a.Length?的訪問進(jìn)行警告,因?yàn)橐呀?jīng)靜態(tài)推斷出?a?為?null?了;
IDE會(huì)對(duì)?b.Length?的訪問進(jìn)行警告,b?類型可能為空;
b!.Length?的訪問操作不會(huì)被警告,因?yàn)檫@種形式的訪問表示老子已經(jīng)知道它可能為?null?了你閉嘴;
string? f =null?語(yǔ)句會(huì)被IDE警告,因?yàn)樯厦嬉呀?jīng)把可為空的引用類型特性關(guān)閉了。
另外此特性不止支持?enable?和?disable?選項(xiàng),還支持?restore?還原之前的設(shè)置,以及通過?safeonly?或?warnings?設(shè)置“定制”啟用警告的范圍,具體可參照其?詳細(xì)說明?。
我們可以發(fā)現(xiàn)這個(gè)特性的的實(shí)質(zhì)其實(shí)是一個(gè)“柔性”斷言,啟用后IDE會(huì)對(duì)部分代碼進(jìn)行警告提示,督促我們進(jìn)行處理,但也止于此了。它非常靈活,新項(xiàng)目啟用此特性是值得的,但舊項(xiàng)目也沒必要升級(jí)。
【C# 8.0新特性:using 聲明】
這里可以直接看官網(wǎng)的例子:
static等價(jià)于:
static也就是說使用?using?關(guān)鍵字修飾的變量聲明,它在作用域結(jié)束后會(huì)自動(dòng)釋放。一開始我沒明白這個(gè)有什么意義,今天和?談到某種情況,就是某些類型之所以會(huì)繼承?IDispose?接口,可能是基于對(duì)語(yǔ)義或設(shè)計(jì)實(shí)現(xiàn)上的軟需求,并非它一定需要調(diào)用?Dispose?方法才能夠釋放(比如?ProcessModule Class (System.Diagnostics)?)。
在這種情況下,對(duì)于我這樣的強(qiáng)迫癥患者而言,明知道沒必要,但也得不厭其煩地?try finally?或者?using{}。有了這個(gè)特性,在寫類似的代碼的時(shí)候,可以只多加幾個(gè)字就讓心情舒暢,是強(qiáng)迫癥患者的福音。另外在進(jìn)行一些很常見的操作比如IO(Stream)、摘要計(jì)算(HashAlgorithm)時(shí),可以少寫一些代碼。
【ASP dot NET Core 3.0中的 gRPC 服務(wù)】
.NET CORE使用gRPC服務(wù)需要用到兩個(gè)Nuget包:
運(yùn)行時(shí):Google.Protobuf
支持套件:Grpc.Tools
對(duì)于客戶端而言,還需要?Grpc.Core?包的支持。
Google.Protobuf?不必解釋,Grpc.Core?是一系列客戶端要用到的API,而?Grpc.Tools?的牛逼之處在于不用編譯 *.proto 文件即可直接在C#中引用它……
對(duì)于.NET Core 2.1 或 2.2而言使用 gPRC 服務(wù)還需要手寫微量代碼(XXX.BindService方法),而到了.NET CORE 3.0,引用?Grpc.AspNetCore.Server?包后即可直接以慣常的配置方式(AddXXX)直接使用此服務(wù)。
這里偷個(gè)懶,直接用 Visual Studio 2019+.NET CORE 3.0做示例。VS 2019中有 gRPC 服務(wù)器的模板,選擇后直接會(huì)創(chuàng)建一個(gè)現(xiàn)成的新手示例。
我們一定會(huì)注意到?Startup?類中?ConfigureServices?方法的語(yǔ)句?services.AddGrpc()?。這個(gè)是慣例,不用去管,重點(diǎn)看?Configure?方法里的代碼片段:
app此處和?WCF?的思想類似,將服務(wù)添加到路由終結(jié)點(diǎn),讓客戶端連接。
然后可以看位于?Protos?文件夾下的?greet.proto?文件:
syntax一個(gè)最簡(jiǎn)單的rpc服務(wù)器。
然后再看?Services?文件夾下的?GreeterService.cs?文件:
using代碼的實(shí)現(xiàn)思路很好理解。我們可以注意到我們能夠直接導(dǎo)入?Greet?命名空間,這是因?yàn)樗呀?jīng)被Grpc.Tools?生成到了項(xiàng)目下?obj?文件夾的項(xiàng)目緩存中。
最后的一個(gè)重點(diǎn)在項(xiàng)目配置文件(*.csproj)中的?ItemGroup?節(jié)點(diǎn):
Include="Protos\greet.proto" GrpcServices="Server" Generator="MSBuild:Compile" />這就是在項(xiàng)目中引用proto文件的方法,具體細(xì)節(jié)詳見官方說明:gRPC services with C#?。
然后我們可以創(chuàng)建個(gè)客戶端嘗試與服務(wù)端通訊,建立一個(gè)命令行程序,引用?Google.Protobuf、Grpc.Tools以及?Grpc.Core?包,同時(shí)在項(xiàng)目配置文件中的?ItemGroup?節(jié)點(diǎn)中加入一句話:
Include="..\GrpcService\Protos\greet.proto" GrpcServices="Client" />(我是在服務(wù)端項(xiàng)目同目錄建立的客戶端項(xiàng)目,所以路徑直接這么寫就OK)
然后我們可以直接寫:
using創(chuàng)建頻道——?jiǎng)?chuàng)建連接——發(fā)送請(qǐng)求——關(guān)閉頻道,簡(jiǎn)單易懂。我們著重看兩點(diǎn)。
其一是?await channel.ShutdownAsync();:
在程序退出前,最好或者說必須關(guān)閉曾經(jīng)創(chuàng)建過的頻道。
另一個(gè)就是我們會(huì)注意到此處代碼中的Greeter?類所公開的接口完全是面向客戶端的。而同理,上面服務(wù)器中的?Greeter?類公開的接口則是面向服務(wù)器的,這是受項(xiàng)目配置中?GrpcServices=Client|Server的影響,非常智能化……
原文地址:https://zhuanlan.zhihu.com/p/63779162
.NET社區(qū)新聞,深度好文,歡迎訪問公眾號(hào)文章匯總?http://www.csharpkit.com?
總結(jié)
以上是生活随笔為你收集整理的c# 路径下的最近文件夹_C#8.0的两个有趣的新特性以及gRPC的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为什么火锅是辣的先开?
- 下一篇: python 执行shell_pytho