亚洲精品中文字幕无乱码_久久亚洲精品无码AV大片_最新国产免费Av网址_国产精品3级片

C語(yǔ)言

C語(yǔ)言函數(shù)式編程中惰性求值詳解

時(shí)間:2024-09-06 18:18:08 C語(yǔ)言 我要投稿
  • 相關(guān)推薦

C語(yǔ)言函數(shù)式編程中惰性求值詳解

  在開(kāi)始介紹今天要講的知識(shí)之前,我們想要理解嚴(yán)格求值策略和非嚴(yán)格求值策略之間的區(qū)別,這樣我們才能夠深有體會(huì)的明白為什么需要利用這個(gè)技術(shù)。首先需要說(shuō)明的是C#語(yǔ)言小部分采用了非嚴(yán)格求值策略,大部分還是嚴(yán)格求值策略。首先我們先演示非嚴(yán)格求值策略的情況,我們先在控制臺(tái)項(xiàng)目中寫(xiě)一個(gè)DoOneThing方法。

  然后在Main方法中寫(xiě)入下面這串代碼:

  然后我們運(yùn)行程序,會(huì)發(fā)現(xiàn)DoOneThing方法并沒(méi)有執(zhí)行。當(dāng)然這看起來(lái)也很正常,因?yàn)檫@是或,并且第一個(gè)已經(jīng)是true了。整個(gè)表達(dá)式就是true了,自然第二個(gè)就無(wú)需求值了。但是這恰恰就是非嚴(yán)格求值的策略,如果是嚴(yán)格求值策略的話整個(gè)表達(dá)式都會(huì)計(jì)算。接著就是嚴(yán)格求值策略的情況了,這個(gè)相信很多人都會(huì)立馬明白,首先我們需要再寫(xiě)一個(gè)DoSomeThing方法:

  接著修改Main方法:

  執(zhí)行之后我們可以看到如下的結(jié)果:

  但是我們可以清楚的看到a的值是false,根本不會(huì)使用b值,但是傳遞參數(shù)的時(shí)候已經(jīng)將DoOneThing方法執(zhí)行并賦值給b,假設(shè)這個(gè)方法是一個(gè)非常耗時(shí)的操作。那么我們就會(huì)白白浪費(fèi)掉這段時(shí)間,最后求得的值也沒(méi)有使用的到。而這正是嚴(yán)格求值策略,而今天的主要目標(biāo)就是改變這種情況,能夠在我們確定需要某個(gè)值的時(shí)候才計(jì)算。下面我們就可以開(kāi)始改造這個(gè)方法,讓其能夠支持惰性求值。首先我們修改DoSomeThing方法:

  這里我們將參數(shù)類型都改成了函數(shù),這樣將要傳遞進(jìn)來(lái)的參數(shù)都改變成函數(shù)。只有在我們需要的時(shí)候才執(zhí)行求值,否則是不會(huì)運(yùn)行的,對(duì)應(yīng)的Main方法中我們需要按照如下方式修改:

  這里我們并不需要把DoOneThing方法的返回類型改掉,如果這樣的話。在現(xiàn)有項(xiàng)目上使用函數(shù)式編程就會(huì)顯得太麻煩了。這里我們僅僅只需要利用匿名函數(shù)就可以辦到了,下面我們可以看最后的執(zhí)行效果:

  DoOneThing方法并沒(méi)有執(zhí)行,因?yàn)镈oSomeThing中根本沒(méi)有確定使用這個(gè)變量,這樣我們就能夠節(jié)省下這部分計(jì)算的時(shí)間,但是事實(shí)上我們還沒(méi)有結(jié)束,實(shí)際的開(kāi)發(fā)中我們可能需要多次使用這個(gè)值,比如下面我們修改DoSomeThing方法:

  并且在Main方法中調(diào)用DoSomeThing方法時(shí)將第一個(gè)參數(shù)改成true,然后執(zhí)行我們就可以看到下面的輸出結(jié)果:

  DoOneThing方法被執(zhí)行了兩次,當(dāng)然我們可以利用局部變量保存,可能你會(huì)這么寫(xiě):

  如果這么寫(xiě),那么我們的惰性求值就沒(méi)有任何意義了,因?yàn)橐贿M(jìn)入這個(gè)方法就執(zhí)行了這個(gè)方法,跟傳遞參數(shù)時(shí)直接將運(yùn)算后的結(jié)果賦值給b沒(méi)有任何區(qū)別了。當(dāng)然也有其他一些技巧可以避免,但是這些技巧可不是下面要講的內(nèi)容,我們可以將其封裝起來(lái),比如我們可以寫(xiě)個(gè)LazyS類:

  我們可以看到在構(gòu)造方法部分我們將對(duì)應(yīng)的函數(shù)作為參數(shù)接收并保存到function中,只有再調(diào)用Value時(shí)候會(huì)執(zhí)行該函數(shù)并將值保存,并且在下次調(diào)用時(shí),如果已經(jīng)求值過(guò)則直接返回緩存過(guò)的值,這樣就能夠避免重復(fù)的執(zhí)行了,對(duì)應(yīng)的我們還要修改DoSomeThing方法和Main方法:

  最終執(zhí)行后我們可以看到僅執(zhí)行了一次DoOneThing方法:

  一些讀者可能為問(wèn)為什么類名不要Lazy而是加個(gè)S,因?yàn)?net中已經(jīng)為我們包含了Lazy類,相信很多人基本上從沒(méi)有用過(guò)。只知道Func和Action的存在,下面我們修改我們的代碼直接利用自帶的:

  最終的結(jié)果之前的是一摸一樣,當(dāng)然系統(tǒng)自帶的Lazy功能更多,并且支持多線程。

【C語(yǔ)言函數(shù)式編程中惰性求值詳解】相關(guān)文章:

嵌入式C語(yǔ)言編程小知識(shí)12-20

C語(yǔ)言編程基礎(chǔ)03-29

初步剖析C語(yǔ)言編程中的結(jié)構(gòu)體03-20

講解C語(yǔ)言編程中的結(jié)構(gòu)體對(duì)齊04-01

C語(yǔ)言入門(mén)什么是編程語(yǔ)言03-20

怎樣學(xué)習(xí)c++c語(yǔ)言編程04-28

如何學(xué)習(xí)C語(yǔ)言編程11-27

C語(yǔ)言函數(shù)遞歸教程03-30

c語(yǔ)言數(shù)學(xué)函數(shù)的介紹10-20