c# 路徑下的最近文件夾_C#8.0的兩個有趣的新特性以及gRPC

最近每天忙著跑很多地方,回家就不想動了,沒什么心情寫東西。今天有空,稍微寫一點。

下文中:

  • 關于C#語法特性的部分需要Visual Studio 2019支持。

  • 關于.NET Core的部分需要安裝.NET 3.0 Preview4,低版本或許也可以但我沒實驗。

  • 如果要在最新版的VS2019中使用.NET 3.0,可能需要在?選項?-?解決方案與項目-?ASP.NET Core?中啟用 使用?.NET Core SDK?預覽版 選項。

【C# 8.0新特性:可空的引用類型】

static 

復制以上簡單的代碼到IDE就能展現這個特性的特點與用法:

  • IDE會對?a?賦值為?null?的操作進行警告, 因為在約定中?a?不可為空,而?b?則不會警告,因為它可以為?null?;

  • IDE會對?a.Length?的訪問進行警告,因為已經靜態推斷出?a?為?null?了;

  • IDE會對?b.Length?的訪問進行警告,b?類型可能為空;

  • b!.Length?的訪問操作不會被警告,因為這種形式的訪問表示老子已經知道它可能為?null?了你閉嘴;

  • string? f =null?語句會被IDE警告,因為上面已經把可為空的引用類型特性關閉了。

另外此特性不止支持?enable?和?disable?選項,還支持?restore?還原之前的設置,以及通過?safeonly?或?warnings?設置“定制”啟用警告的范圍,具體可參照其?詳細說明?。

我們可以發現這個特性的的實質其實是一個“柔性”斷言,啟用后IDE會對部分代碼進行警告提示,督促我們進行處理,但也止于此了。它非常靈活,新項目啟用此特性是值得的,但舊項目也沒必要升級。

【C# 8.0新特性:using 聲明】

這里可以直接看官網的例子:

static 

等價于:

static 

也就是說使用?using?關鍵字修飾的變量聲明,它在作用域結束后會自動釋放。一開始我沒明白這個有什么意義,今天和?談到某種情況,就是某些類型之所以會繼承?IDispose?接口,可能是基于對語義或設計實現上的軟需求,并非它一定需要調用?Dispose?方法才能夠釋放(比如?ProcessModule Class (System.Diagnostics)?)。

在這種情況下,對于我這樣的強迫癥患者而言,明知道沒必要,但也得不厭其煩地?try finally?或者?using{}。有了這個特性,在寫類似的代碼的時候,可以只多加幾個字就讓心情舒暢,是強迫癥患者的福音。另外在進行一些很常見的操作比如IO(Stream)、摘要計算(HashAlgorithm)時,可以少寫一些代碼。

【ASP dot NET Core 3.0中的 gRPC 服務】

.NET CORE使用gRPC服務需要用到兩個Nuget包:

  • 運行時:Google.Protobuf

  • 支持套件:Grpc.Tools

對于客戶端而言,還需要?Grpc.Core?包的支持。

Google.Protobuf?不必解釋,Grpc.Core?是一系列客戶端要用到的API,而?Grpc.Tools?的牛逼之處在于不用編譯 *.proto 文件即可直接在C#中引用它……

對于.NET Core 2.1 或 2.2而言使用 gPRC 服務還需要手寫微量代碼(XXX.BindService方法),而到了.NET CORE 3.0,引用?Grpc.AspNetCore.Server?包后即可直接以慣常的配置方式(AddXXX)直接使用此服務。

這里偷個懶,直接用 Visual Studio 2019+.NET CORE 3.0做示例。VS 2019中有 gRPC 服務器的模板,選擇后直接會創建一個現成的新手示例。

我們一定會注意到?Startup?類中?ConfigureServices?方法的語句?services.AddGrpc()?。這個是慣例,不用去管,重點看?Configure?方法里的代碼片段:

app

此處和?WCF?的思想類似,將服務添加到路由終結點,讓客戶端連接。

然后可以看位于?Protos?文件夾下的?greet.proto?文件:

syntax 

一個最簡單的rpc服務器。

然后再看?Services?文件夾下的?GreeterService.cs?文件:

using 

代碼的實現思路很好理解。我們可以注意到我們能夠直接導入?Greet?命名空間,這是因為它已經被Grpc.Tools?生成到了項目下?obj?文件夾的項目緩存中。

最后的一個重點在項目配置文件(*.csproj)中的?ItemGroup?節點:

Include="Protos\greet.proto" GrpcServices="Server" Generator="MSBuild:Compile" />

這就是在項目中引用proto文件的方法,具體細節詳見官方說明:gRPC services with C#?。

然后我們可以創建個客戶端嘗試與服務端通訊,建立一個命令行程序,引用?Google.Protobuf、Grpc.Tools以及?Grpc.Core?包,同時在項目配置文件中的?ItemGroup?節點中加入一句話:

Include="..\GrpcService\Protos\greet.proto" GrpcServices="Client" /> 

(我是在服務端項目同目錄建立的客戶端項目,所以路徑直接這么寫就OK)

然后我們可以直接寫:

using 

創建頻道——創建連接——發送請求——關閉頻道,簡單易懂。我們著重看兩點。

其一是?await channel.ShutdownAsync();

在程序退出前,最好或者說必須關閉曾經創建過的頻道。

另一個就是我們會注意到此處代碼中的Greeter?類所公開的接口完全是面向客戶端的。而同理,上面服務器中的?Greeter?類公開的接口則是面向服務器的,這是受項目配置中?GrpcServices=Client|Server的影響,非常智能化……

原文地址:https://zhuanlan.zhihu.com/p/63779162

.NET社區新聞,深度好文,歡迎訪問公眾號文章匯總?http://www.csharpkit.com?8be7f4726f27a1ec17a5510e950dc058.png

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

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

相關文章

alter table add column多個字段_ElementUI表格el-table表頭固定自適應高度解決方案

一、前言ElementUI、iView都以相同的方式提供了表格組件表頭固定的方法,即設置組件的height屬性。表頭固定很重要,就在于當表格數據項很多時,滾動條出現在表格組件內,而不是出現在表格組件外——這樣的優點在于,滾動瀏…

oracle ora 12011,執行oracle中的job報錯:ORA-12011:無法執行作業1

LZ在做一個job執行每天新增一個表的操作時,存儲過程運行沒問題,job也創建成功,但運行job時,卻報錯: ,后又用sys用戶登陸創建了同樣的存儲過程和job,結果可以執行成功。當時就猜測是權限問題。后…

e盤是否具有讀寫權限_輕松搭建MySQL主從復制、讀寫分離(雙機熱備)

主從復制: 當mysql數據庫的數據量太大的時候,查詢數據就很吃力了,無論怎么優化都會產生瓶頸,這時我們需要增加服務器設備來實現分布式數據庫,實現多機熱備份,要想實現多機的熱備,首先要了解主從…

linux運維之道基礎命令,Linux運維之道(7)——Linux管理類命令

(Linux)[系統管理]1. 目錄管理類命令1.1 cd命令格式:cd [-L|[-P [-e]] [-]] [dir]被你忽略的小知識:在這里科普一個小小的知識點,就是關于cd -為什么可以自由的在當前目錄和之前目錄相互切換?其實,在我們的 Shell 的環…

html畫圖代碼_python之matplotlib畫圖教程(2)

各位小表貝,你們的畫圖小老弟又來咯~上一次我們聊到了如何畫離散圖,這一次我們來點復雜的,準備好了么,系好安全帶,準備發車咯~滴滴~我們先來點比較簡單,那種易于上手的。如果現在我知道了兩個點的坐標&…

在linux上面找一個腳本,30個Linux Shell腳本經典案例

在學習Linux運維時,普遍反饋是:Linux Shell是一個很難的知識板塊。雖然大家都認真學,基本的語法也都掌握了,但有需求時,很難直接上手編程,要么寫了很久,要么寫不好!也有很多做運維很…

python圖像識別代碼_用Python進行簡單圖像識別(驗證碼)

這是一個最簡單的圖像識別,將圖片加載后直接利用Python的一個識別引擎進行識別 將圖片中的數字通過 pytesseract.image_to_string(image)識別后將結果存入到本地的txt文件中 #-*-encoding:utf-8-*- import pytesseract from PIL import Image class GetImageDate(ob…

linux 端口添加地址,linux – 綁定,網絡(接口)和多播地址有什么區別?

實際上你在這里混淆了三種方法.第一個是bind,用于將套接字綁定到指定的地址和端口.使用此方法基本上您打開一個udp-port并等待該地址上的此端口的數據.第二個是join-method,用于讓套接字加入指定的多播組.組播組的示例是224.0.0.1 – “所有主機”組播組 – 其針對同一網段上的…

c++ map初始化_Go學習每日一問(18)-map元素查找

每次學習并整理一個Golang的知識點,每天進步一點點。今天學習下go中的一個知識點:map元素查找日省吾身1.下面代碼中 A B 兩處應該怎么修改才能順利編譯?func main() { var m map[string]int //A m["a"] 1 if v : m["b&q…

linux運維需要哪些網絡知識,Linux運維學習筆記-網絡技術知識體系總結

jTemplates部分語法介紹1.{#if} {#if |COND|}..{#elseif |COND|}..{#else}..{#/if} Examples: {#if 2*816} good {#else} fail {# ...解密jQuery內核 DOM操作方法(二)html,text,val回顧下幾組DOM插入有關的方法 innerHTML 設置或獲取位于對象起始和結束標簽…

-bash: wget: 未找到命令_18個堪稱神器的命令行工具,高效運維必備

上期入口:24個 CSS 高級技巧合集提示:因公眾號不支持超鏈接,上圖所有項目地址,可在公眾號后臺回復關鍵字 “命令行工具” 獲取。thefuck命令行打錯了以后,打一個fuck就會自動糾正。GitHub:https://github.c…

linux編輯java文本,linux下的文本編輯器VI的使用命令

1、 移動光標H        #移到屏幕的左上角M         #移到屏幕的中間行開頭L          #移到屏幕的最后一行[         #移到文件開始位置 (雙擊)]         #移到文件結束位置(雙擊):n         #移到文件的第n行Ctrl b     …

python3.8.0安裝_Python3.8.0

Python3.8.0是一款廣受程序員歡迎的編程語言,也是面向對象的一款設計語言,Python以其語言的靈活和簡易性,具有非常簡捷而清晰的語法特點,在腳本工具、數據分析、web后端等等領域都有著優良的表現,收到了大家的廣泛應用…

linux系統proc目錄,快速了解Linux系統下的proc目錄

/proc/devices文件這個文件列出字符和塊設備的主設備號,以及分配到這些設備號的設備名稱。常用的命令為#cat /proc/devices(在調試驅動的時候這個還是有用的,可以通過lsmod查看驅動模塊是否加載)/proc/interrupts這個文件的每一行都有一個保留的中斷。每…

cv2.error: opencv(4.4.0)_【從零學習OpenCV 4】輪廓面積與長度

本文首發于“小白學視覺”微信公眾號,歡迎關注公眾號 本文作者為小白,版權歸人民郵電出版社發行所有,禁止轉載,侵權必究! 經過幾個月的努力,小白終于完成了市面上第一本OpenCV 4入門書籍《OpenCV 4開發詳解…

linux 腳本批量刪除,Linux Shell使用Bash腳本批量刪除文件

PHP每天生成一個存有系統要刪除的臨時文件的.out文件列表,由bash腳本逐行通過讀取.out文件(每一行代表一個待刪除的文件)挨個刪除,代碼如下(dl.sh): #!/bin/bash # Shell script utility to delete file. # You can call script as follows, …

python自定義安裝哪些不需要_【1】python模塊:自定義模塊的3種導入方式

一、定義 模塊就是用一堆的代碼實現了一些功能的代碼的集合,通常一個或者多個函數寫在一個.py文件里,而如果有些功能實現起來很復雜,那么就需要創建n個.py文件,這n個.py文件的集合就是模塊。如果不懂可以先看下面這篇博文&#xf…

linux mysql數據庫日志關閉,linux 怎樣恢復mysql數據庫日志

1、用dump命令備份數據庫。# mysqldump -u root -p dbfile > dbfile.sql2、用rsync從新服務器獲得備份的文件(SCP或WGET也可以)。# rsync -avr rootmyolddbserver:/home/mydumpfolder/dbfile.sql3、登陸新服務器的mysql客戶端。# mysql -u root -p4. 建立數據庫。mysql> …

linux劃分root_vg,為Linux添加新硬盤,劃分LVM分區

1、為VM添加兩塊SCSI硬盤→→完成后重啟VM→→運行fdisk -l,可以看到系統自動將添加的硬盤識別為/dev/sdb和dev/sdc.2、分區對sdb和sdc進行分區,並調整分區類型為8e(LVM類型),sdb劃分為sdb1,sdb2,sdc劃分為sdc1,sdc2,sdc3[rootpromote ~]# fdisk /dev/sd…