C#高级技师语法,你会吗?
【導(dǎo)讀】呀,最近太忙了,沒什么時間去看和學(xué)習(xí),既然長篇文章一時半會吐不出來,短篇還是可以搞搞,操作系統(tǒng)絕不會斷更。本文我們來搞點C#中高逼格語法。
=>這玩意從C#6開始支持方法,運(yùn)算符和只讀屬性的表達(dá)式主體定義。從C#7.0開始支持構(gòu)造函數(shù),終結(jié)器以及屬性和索引器訪問器的表達(dá)式主體定義。所以本文來講講=>運(yùn)算符
高級語法
我們正常寫一個方法,都是很明確的方法主體,我們稱之為“塊主體”,比如如下
static?string?Say() {return?"Hello?World"; }用了=>運(yùn)算符,我們可以將上述方法簡化到極致
如上就通過=>運(yùn)算符隱式轉(zhuǎn)換為方法主體的返回類型,最終還是翻譯成第一種寫法。
C#中的lambda表達(dá)式絕對秒殺Java,用過Java我也是這么認(rèn)為,不服可以一戰(zhàn),我們看用過最多的大概是對集合的處理,集合中內(nèi)置使用幾種委托,繼而委托簡化為lambda,比如如如下Where過濾條件調(diào)用Func委托
要是到這里就結(jié)束,那么本文也發(fā)表不出來,公眾號文章必須至少要300字(不算任何標(biāo)點符號、空格、圖片等等),所以我要極力湊滿至少300字
開玩笑哈,每寫一篇我都竭盡所能希望能讓各位童鞋能有所收獲,盡管可能每一篇不是那么都盡人意,進(jìn)入話題正軌
上述只是最基礎(chǔ)的鋪墊,要是這個語法都不知曉,那這......就不用往下看了,先補(bǔ)補(bǔ)基礎(chǔ)知識再繼續(xù)本文接下來的內(nèi)容
上述我們講解了=>運(yùn)算符和內(nèi)置泛型委托,我們看到更多的是將委托作為方法參數(shù)來使用,將委托作為方法參數(shù)或返回值也是可行dei,比如如下:
定義如上方法后,我們該如何調(diào)用呢?你要是會用lambda,那么此種方法調(diào)用自然不在話下
要是上述方法看不懂,那這.....請折返,那就需要回顧并鞏固下基礎(chǔ),這里順便提一下關(guān)于變量定義的問題,有些極力建議不要使用var,比如上述你一眼壓根看不出返回類型是啥,只有將鼠標(biāo)放上去才知道返回的是一個委托,有些用var(比如我)是為了方便,所以這里看個人使用習(xí)慣,沒有絕對的好與壞
接下來我們再對此方法進(jìn)行改造,看看該方法的另外一個變體版本
第一眼看起來和第一種定義方式相差無幾,我也是這么認(rèn)為,那么調(diào)用該方法和第一種調(diào)用是一樣的嗎?默思一秒,答案:不一樣
變體之后的方法調(diào)用和我們正常進(jìn)行方法調(diào)用一樣,但第一種方式則是返回方法的引用,二者看起來差不多,但是區(qū)別還是很大
不知道你注意到了沒有,二者還有一個很大的區(qū)別,變體方法使用了readonly修飾符,而第一種方式則不能使用該修飾符,是不是又漲知識了呢?
我相信你寫過的絕大多數(shù)方法都無法使用readonly修飾符(編譯報錯),所以有面試官問了很偏門的問題,方法支持使用readonly修飾符嗎?看過本文后,應(yīng)毫不猶豫的回答:支持
上述變體方法支持readonly,其本質(zhì)其實是字段
public?static?readonly?Func<string>?Variable1?=?()?=>?"Hello";那么問題來了,有的童鞋就疑惑了,那為什么第一種方式就不支持呢?因為第一種方法返回的是方法引用,這樣的答案就好比“標(biāo)準(zhǔn)”解題老師
很顯然沒有很強(qiáng)的說服力,自問自答,自己騙自己,要是我們?nèi)缦逻@樣為何就不支持呢?
static?readonly?string?Say()?=>?"Hello?World";至于為何不支持的本質(zhì),這個問題就留給大家去探討吧,至少就目前而言,好像只有上述變體方式支持readonly修飾符,若有深層次見解,歡迎留言
重點來了,又到了,分析本質(zhì)的時候了
我們看看第一種返回委托的方法大致會翻譯成什么呢?別擔(dān)心,很簡單,你看的懂
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));}; }是不是很了然,就是簡單的將委托轉(zhuǎn)換為了匿名方法,但是最終返回的是匿名方法引用,接下來我們再來看第二種方法變體
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)); };該變體則只是將委托轉(zhuǎn)換為匿名方法后將對應(yīng)參數(shù)傳進(jìn)去,但是最后返回的是委托定義的返回值
好了,本文到此結(jié)束,接下來繼續(xù)我們操作系統(tǒng)的學(xué)習(xí),我們下一節(jié)再見,來自周末凌晨的晚安。
總結(jié)
以上是生活随笔為你收集整理的C#高级技师语法,你会吗?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据结构与算法专题——第九题 鸡尾酒排序
- 下一篇: 将终结点图添加到你的ASP.NET Co