日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

C#高级技师语法,你会吗?

發布時間:2023/12/4 C# 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#高级技师语法,你会吗? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【導讀】呀,最近太忙了,沒什么時間去看和學習,既然長篇文章一時半會吐不出來,短篇還是可以搞搞,操作系統絕不會斷更。本文我們來搞點C#中高逼格語法。

=>這玩意從C#6開始支持方法,運算符和只讀屬性的表達式主體定義。從C#7.0開始支持構造函數,終結器以及屬性和索引器訪問器的表達式主體定義。所以本文來講講=>運算符

高級語法

我們正常寫一個方法,都是很明確的方法主體,我們稱之為“塊主體”,比如如下

static?string?Say() {return?"Hello?World"; }

用了=>運算符,我們可以將上述方法簡化到極致

Console.WriteLine(Say()); static?string?Say()?=>?"Hello?World";

如上就通過=>運算符隱式轉換為方法主體的返回類型,最終還是翻譯成第一種寫法。

C#中的lambda表達式絕對秒殺Java,用過Java我也是這么認為,不服可以一戰,我們看用過最多的大概是對集合的處理,集合中內置使用幾種委托,繼而委托簡化為lambda,比如如如下Where過濾條件調用Func委托

var?list?=?new?List<string>()?{?"h",?"e",?"l",?"l",?"o"?}; list?=?list.Where(d?=>?d.Equals("o")).ToList();

要是到這里就結束,那么本文也發表不出來,公眾號文章必須至少要300字(不算任何標點符號、空格、圖片等等),所以我要極力湊滿至少300字

開玩笑哈,每寫一篇我都竭盡所能希望能讓各位童鞋能有所收獲,盡管可能每一篇不是那么都盡人意,進入話題正軌

上述只是最基礎的鋪墊,要是這個語法都不知曉,那這......就不用往下看了,先補補基礎知識再繼續本文接下來的內容

上述我們講解了=>運算符和內置泛型委托,我們看到更多的是將委托作為方法參數來使用,將委托作為方法參數或返回值也是可行dei,比如如下:

static?Func<long,?int>?DefaultDelayInSecondsByAttemptFuncOne() {return?(attempt)?=>{var?random?=?new?Random();return?(int)Math.Round(Math.Pow(attempt?-?1,?4)?+?15?+?random.Next(30)?*?attempt);}; }

定義如上方法后,我們該如何調用呢?你要是會用lambda,那么此種方法調用自然不在話下

var?func?=?DefaultDelayInSecondsByAttemptFuncOne(); Console.WriteLine(func(2));

要是上述方法看不懂,那這.....請折返,那就需要回顧并鞏固下基礎,這里順便提一下關于變量定義的問題,有些極力建議不要使用var,比如上述你一眼壓根看不出返回類型是啥,只有將鼠標放上去才知道返回的是一個委托,有些用var(比如我)是為了方便,所以這里看個人使用習慣,沒有絕對的好與壞

接下來我們再對此方法進行改造,看看該方法的另外一個變體版本

static?readonly?Func<long,?int>?DefaultDelayInSecondsByAttemptFuncTwo?=?attempt?=> {var?random?=?new?Random();return?(int)Math.Round(Math.Pow(attempt?-?1,?4)?+?15?+?random.Next(30)?*?attempt); };

第一眼看起來和第一種定義方式相差無幾,我也是這么認為,那么調用該方法和第一種調用是一樣的嗎?默思一秒,答案:不一樣

var?result?=?DefaultDelayInSecondsByAttemptFuncTwo(2); Console.WriteLine(result);

變體之后的方法調用和我們正常進行方法調用一樣,但第一種方式則是返回方法的引用,二者看起來差不多,但是區別還是很大

不知道你注意到了沒有,二者還有一個很大的區別,變體方法使用了readonly修飾符,而第一種方式則不能使用該修飾符,是不是又漲知識了呢?

我相信你寫過的絕大多數方法都無法使用readonly修飾符(編譯報錯),所以有面試官問了很偏門的問題,方法支持使用readonly修飾符嗎?看過本文后,應毫不猶豫的回答:支持

上述變體方法支持readonly,其本質其實是字段

public?static?readonly?Func<string>?Variable1?=?()?=>?"Hello";

那么問題來了,有的童鞋就疑惑了,那為什么第一種方式就不支持呢?因為第一種方法返回的是方法引用,這樣的答案就好比“標準”解題老師

很顯然沒有很強的說服力,自問自答,自己騙自己,要是我們如下這樣為何就不支持呢?

static?readonly?string?Say()?=>?"Hello?World";

至于為何不支持的本質,這個問題就留給大家去探討吧,至少就目前而言,好像只有上述變體方式支持readonly修飾符,若有深層次見解,歡迎留言

重點來了,又到了,分析本質的時候了

我們看看第一種返回委托的方法大致會翻譯成什么呢?別擔心,很簡單,你看的懂

private?static?Func<long,?int>?DefaultDelayInSecondsByAttemptFuncOne() {return?delegate(long?attempt){Random?random?=?new?Random();return?(int)Math.Round(Math.Pow(attempt?-?1,?4.0)?+?15.0?+?(double)(random.Next(30)?*?attempt));}; }

是不是很了然,就是簡單的將委托轉換為了匿名方法,但是最終返回的是匿名方法引用,接下來我們再來看第二種方法變體

private?static?readonly?Func<long,?int>?DefaultDelayInSecondsByAttemptFuncTwo?=?delegate(long?attempt) {Random?random?=?new?Random();return?(int)Math.Round(Math.Pow(attempt?-?1,?4.0)?+?15.0?+?(double)(random.Next(30)?*?attempt)); };

該變體則只是將委托轉換為匿名方法后將對應參數傳進去,但是最后返回的是委托定義的返回值

好了,本文到此結束,接下來繼續我們操作系統的學習,我們下一節再見,來自周末凌晨的晚安。

總結

以上是生活随笔為你收集整理的C#高级技师语法,你会吗?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。