成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Lambda表達式動態函數編程:更加靈活強大

原創
開發 開發工具 后端
Lambda表達式是一種抽象的代碼層次,它增加了程序的靈活性和動態性,這些特性對程序來說是非常實用而且有益的。本文介紹如何使用Lambda表達式來作為函數的參數,從而支持動態函數行為。

【51CTO精選譯文】編寫代碼有許多方法。有時候,我們編寫代碼盡可能簡單,如直接使用內聯運算(inline calculations);有時我們卻會給代碼添加一些間接的層次。雖然這些間接的、抽象的層次使得我們在理解代碼時更困難一些,但它卻增加了程序的靈活性和動態性,這些特性對程序來說是非常實用而且有益的。

本文將向你介紹如何使用Lambda表達式來作為函數的參數,從而支持動態函數行為。如果你在程序的關鍵地方存在類似需求的話,那么使用這種方法你將創建一個更加靈活、功能強大的解決方案。

大多數情況

此時,大量的代碼是用直接的方式進行編寫。假設,你編寫一個應用程序來計算營業稅,直接寫出計算過程是合理的。例如,美國密歇根州目前的銷售稅為6%,要計算營業稅的話,你可以這樣寫:

  1. Dim total as Double = value * (1 + .06

如果把這種計算寫成內聯形式的話,那問題很快就會解決掉,但它并不是一種靈活的、可重用的解決方案。下一步的改進方案是定義一個函數來執行計算,你可以為該函數提供可選參數。例如,你可以將計算表達式放到一個函數中去,使稅款總額成為一個可選項,同時提供稅款最常見的默認值。清單1顯示的的是將計算過程轉移到一個函數中的代碼。

清單1:帶有可選默認值和常規函數的可重用代碼

  1. Function CalculateSalesTax(ByVal total As Double, _  
  2.   Optional ByVal tax As Double = 0.06) As Double  
  3.   Return total * (1 + tax)  
  4. End Function 

#T#所有能夠編寫出類似清單1中帶有可選參數代碼的初級程序員最終都會被聘用。

清單1中的解決方案是實用的,它能夠滿足很多情況的需求。這種解決方案唯一的缺點是它不靈活。您可以將金錢總額和稅收數額一起傳遞,并且計算結果始終是相同的。此外,正如我之前所說的那樣,對于定義函數解決方案而言,一個恰當命名的函數是可重用的,并且可以進行自我注釋的。然而有些時候,你需要編寫一個更加靈活的解決方案。

個別情況

有時,特別當你正在編寫一些將被別人使用的代碼時,您需要編寫得更加靈活。你可以通過加入更多的函數參數來使你的代碼更加靈活。函數參數的使用意味著該行為的一部分將以函數的形式進行傳遞。一般情況下,如果你不關心函數必須支持的所有情況,那么你可以使用這種編程方式。

您可以使用多種方法來定義函數參數。您可以定義一個委托(delegate)或者是定義一個函數——把參數類型作為委托類型的參數,也可以使用預先存在的泛型委托,例如Func。為了提供功能參數,您可以添加一個現有的第二函數和AddressOf運算符,您也可以傳遞一個Lambda表達式。清單2演示了如何定義一個使用了預定義Func泛型委托的函數參數,并且滿足Lambda表達式的參數要求。

清單2:帶有滿足Lambda表達式參數的函數。

  1. Module Module1  
  2.  Sub Main()  
  3.   Dim total = CalculateSalesTax(100, 0.06, _  
  4.     Function(sale, tax) sale * (1 + tax))  
  5.   Console.WriteLine(total)  
  6.   Console.ReadLine()  
  7.  End Sub 
  8.     
  9.  Function CalculateSalesTax(ByVal total As Double, _  
  10.   ByVal tax As Double, _  
  11.   ByVal calculator As Func(Of DoubleDoubleDouble)) _  
  12.   As Double 
  13.   Return calculator(total, tax)  
  14.  End Function 
  15. End Module 
  16.  

CalculateSalesTax把它所收到所有行為作為第三個參數。第三個參數定義為Func(Of Double, Double, Double),這是一個泛型委托。其他泛型委托分別為行動(T)和謂詞(Of T)。

計算器參數可滿足任何函數,它有兩個double參數和double返回類型。這可能是一個函數地址,或是一個分配給相同類型變量(Func(Of Double, Double, Double))的Lambda表達式,也可能就是一個Lambda表達式。

清單2中的計算參數滿足Lambda表達式

  1. Function(sale, tax) sale * (1 + tax) 

Lambda表達式只是一個非常簡單的函數。它使用函數的關鍵字,其參數名可以選擇帶或不帶參數類型,以及一些執行工作的語句,其函數結尾、函數名稱,以及關鍵字return均不是必需的。

編寫類似代碼使得消費者(使用這些代碼的程序員)可以決定傳遞給函數的行為,比如說CalculateSalesTax 的例子。可以看下這種情況,營業稅的稅率是固定的,除非總金額高于5萬元美元。雖然這些高價奢侈稅在美國一些州中是強行征收的,但是消費者可以將奢侈稅納入另一個替代函數中。清單3顯示了一個替代的代碼(其中包括一個與奢侈稅有關的任意值)。

清單3: 在清單2的基礎上增加了額外功能的替代解決方案。

  1. Module Module1  
  2. Sub Main()  
  3.    Dim calculator = Function(sale, tax) IIf(sale > 25000, _  
  4.      sale * (1 + tax + 0.02), sale * (1 + tax))  
  5.     
  6.    Dim total = CalculateSalesTax(100000, 0.06, calculator)  
  7.    Console.WriteLine(total)  
  8.    Console.ReadLine()  
  9.  End Sub 
  10.     
  11.  Function CalculateSalesTax(ByVal total As Double, _  
  12.      Optional ByVal tax As Double = 0.06) As Double 
  13.    Return total * (1 + tax)  
  14.  End Function 
  15.     
  16.  Function CalculateSalesTax(ByVal total As DoubleByVal tax As Double, _  
  17.     ByVal calculator As Func(Of DoubleDoubleDouble)) As Double 
  18.    Return calculator(total, tax)  
  19.  End Function 
  20. End Module 
  21.  

請注意,在該解決方案中,一個新的Lambda表達式分配給了一個匿名變量。新的Lambda表達式使用IIf函數來判定銷售金額是否超過了25,000元;額外花費的金額將被添加到征收奢侈稅的列表中。

總結

該解決方案中的代碼使用了一個Lambda表達式和一些函數參數。該解決方案可重復使用,非常靈活,因為定義函數參數意味著以后的消費者可以提供該解決方案中的一部分(參數部分)。

原文:Dynamic Programming with Lambda Expressions 作者:Paul Kimmel

責任編輯:yangsai 來源: 51CTO.com
相關推薦

2009-08-31 17:11:37

Lambda表達式

2023-03-23 18:40:18

Lambda編程C++

2020-10-16 06:40:25

C++匿名函數

2021-08-31 07:19:41

Lambda表達式C#

2009-09-09 13:01:33

LINQ Lambda

2009-09-15 15:18:00

Linq Lambda

2022-12-05 09:31:51

接口lambda表達式

2009-09-11 09:48:27

Linq Lambda

2009-09-14 13:57:20

C# Lambda表達Lambda表達式

2023-09-25 13:28:14

C++Lambda

2009-10-12 10:11:08

Lambda表達式編寫

2009-08-27 09:44:59

C# Lambda表達

2009-09-15 17:30:00

Linq Lambda

2009-09-17 09:44:54

Linq Lambda

2009-09-17 10:40:22

Linq Lambda

2012-06-26 10:03:58

JavaJava 8lambda

2024-03-25 13:46:12

C#Lambda編程

2009-08-10 10:06:10

.NET Lambda

2023-11-02 18:45:00

Rust編程表達式

2013-04-07 15:44:26

Java8Lambda
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久只有精品 | 亚洲黄色av| 福利视频二区 | 日韩一二三区视频 | 人人人艹| 欧美国产精品一区二区三区 | 久久性色 | 伊人99 | 狠狠干网站 | 久久免费精品 | 免费高清av | 国产精品1区 | 亚洲美女一区 | 国产精品久久久久久久久久久久冷 | 色狠狠一区 | 99这里只有精品视频 | 一区二区视频在线观看 | 97伦理| 亚洲精品一区二区三区在线 | 国产精品区二区三区日本 | 女朋友的闺蜜3韩国三级 | 日韩一区二区免费视频 | 亚洲aⅴ精品 | 国产一区二区三区在线免费观看 | 久久精品一区二区三区四区 | 日韩视频一区二区三区 | 久久最新| 成人深夜福利 | 欧美一级二级视频 | 综合一区二区三区 | 日本三级日产三级国产三级 | 美国av片在线观看 | 中文字幕在线一区二区三区 | 精品国产1区2区3区 一区二区手机在线 | 天天操夜夜操 | 国产免费一区二区三区 | 欧美黄视频 | 综合久久综合久久 | 欧产日产国产精品视频 | 国产香蕉视频在线播放 | 成人网在线观看 |