如何理解Lambda表達(dá)式和依賴倒置

如何理解Lambda表達(dá)式和依賴倒置,相信很多沒有經(jīng)驗(yàn)的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。

創(chuàng)新互聯(lián)建站致力于互聯(lián)網(wǎng)網(wǎng)站建設(shè)與網(wǎng)站營銷,提供網(wǎng)站制作、網(wǎng)站建設(shè)、網(wǎng)站開發(fā)、seo優(yōu)化、網(wǎng)站排名、互聯(lián)網(wǎng)營銷、小程序設(shè)計(jì)、公眾號商城、等建站開發(fā),創(chuàng)新互聯(lián)建站網(wǎng)站建設(shè)策劃專家,為不同類型的客戶提供良好的互聯(lián)網(wǎng)應(yīng)用定制解決方案,幫助客戶在新的全球化互聯(lián)網(wǎng)環(huán)境中保持優(yōu)勢。

 Lambda表達(dá)式、依賴倒置

依賴倒置原則的實(shí)現(xiàn)也會在最后來粗略的講解一下。 沒有核心的主題,如果說要強(qiáng)制定義的話就是這些內(nèi)容都是基礎(chǔ)知識,是為了后續(xù)學(xué)習(xí)MVC框架做鋪墊。

1 Lambda

Lambda表達(dá)式在日常的開發(fā)中很常見,使用Lambda表達(dá)式可以自由的定義函數(shù)體并且精簡代碼量,那么Lambda表達(dá)式是什么呢?

Lambda表達(dá)式是匿名函數(shù),而匿名函數(shù)又是委托,所以lambda表達(dá)式就是委托。(編譯成中間語言后有一點(diǎn)小小的區(qū)別,不過大致是一樣的)

1.1 Lambda的定義

既然說到Lambda是委托了,那就的有個(gè)類型,這里我們使用的是.NET給我們提供的Fun<T>泛型委托,F(xiàn)un<T>是帶返回值的委托類型。

1.2 相互認(rèn)識

示例代碼1.1-1

 1         private bool Comparison(int num1, int num2)
 2         {
 3             if (num1 > num2)
 4             {
 5                 return true;
 6             }
 7             else
 8             {
 9                 return false;
10             }
11         }
1 Func<int, int, bool> ComparisonNum = new Func<int, int, bool>(Comparison);
2 Comparison(5, 3);//return true

上面的示例中明顯,很簡單的定義了Func<int,int,bool>這么一個(gè)類型的委托,ComparisonNum的含義就是要有兩個(gè)int類型的參數(shù)并且返回值為bool類型的函數(shù)。這是最原始的一個(gè)版本,下面將演示怎么樣的去過度到Lambda表達(dá)式。

示例代碼1.1-2

 1  Func<int, int, bool> ComparisonNum=
 2                 delegate(int num1,int num2)
 3                 {
 4                     if (num1 > num2)
 5                     {
 6                         return true;
 7                     }
 8                     else
 9                     {
10                         return false;
11                     }
12                 };
1 ComparisonNum(3, 5);//return false

從代碼1.1-2中可以看出,使用匿名委托和上面的那個(gè)1.1-1沒有什么大大的區(qū)別,只不過匿名委托簡便了一點(diǎn)。下面再來看使用Lambda表達(dá)式的示例。

示例代碼1.1-3

1  Func<int, int, bool> ComparisonNum = (num1, num2) => { return num1 > num2; };

1.1-3代碼中在=>左邊的"(num1,num2)"是要使用的參數(shù),根據(jù)Func<int, int, bool> 來定義的,實(shí)際應(yīng)寫為
示例代碼1.1-4

1 Func<int, int, bool> ComparisonNum = (int num1,int num2) => { return num1 > num2; };

1.1-3使用的是簡便的寫法,因?yàn)橛蠽S這么強(qiáng)大環(huán)境的支持,可以根據(jù)前面變量定義的委托類型,自動的設(shè)置為Lambda表達(dá)式參數(shù)類型,以求符合前面類型的定義,而=>的右邊則是Lambda表達(dá)式的函數(shù)主體,同匿名委托一個(gè)道理。這一小節(jié)對Lambda只是作了很簡單的一個(gè)示例,意在讓讀者基礎(chǔ)的了解到這方面的內(nèi)容,篇幅的原因就不多說了。

2. 依賴倒置原則

設(shè)計(jì)原則是在設(shè)計(jì)模式或者是框架設(shè)計(jì)中都有遵循著的。這一節(jié)就講解一下依賴倒置原則的實(shí)現(xiàn)之一依賴注入。

在工作中學(xué)習(xí)中,面向抽象編程、依賴于抽象不依賴于具體這些話語是經(jīng)常性的見到,本節(jié)中的示例都會涉及到這些概念,很簡單的一個(gè)示例讓大家有個(gè)了解。

1 public class Entity
2 {
3 }

這里先定義了一個(gè)實(shí)體類,只是用作演示,沒有什么具體功能,

1     public class ObjectFactory
2     {
3         public Entity CreateObject()
4         {
5             return new Entity();
6         }
7     }

然后又定義一個(gè)工廠,用作獲取到Entity類型的實(shí)例,

1     public class IocController
2     {
3         public static Entity GetEntity()
4         {
5             ObjectFactory entityFactory = new ObjectFactory();
6             return entityFactory.CreateObject();
7         }
8     }

這是一個(gè)控制器,客戶端在獲得Entity類型的唯一依賴,在客戶端只會IocController.GetEntity();這樣來獲得Entity實(shí)例。而我們要做的就是降低IocController和ObjectFactory的耦合度,其它的都不需要管了。

如圖1

如何理解Lambda表達(dá)式和依賴倒置

這時(shí)候的依賴關(guān)系正如上圖所示的這樣,那就要靠依賴抽象去解耦了。

 1     public interface IObjectFactory
 2     {
 3         Entity CreateObject();
 4     }
 5     public class ObjectFactory:IObjectFactory
 6     {
 7         public Entity CreateObject()
 8         {
 9             return new Entity();
10         }
11     }

是的,對ObjectFactory類型進(jìn)行了抽象,有了IObjectFactory接口類型。

圖2

如何理解Lambda表達(dá)式和依賴倒置

這個(gè)時(shí)候在腦海中的圖形是不是應(yīng)該是如圖2所示的那樣,想象確實(shí)是美好的,但是現(xiàn)實(shí)卻不是這樣。

1     public class IocController
2     {
3         public static Entity GetEntity()
4         {
5             IObjectFactory entityFactory = new ObjectFactory();
6             return entityFactory.CreateObject();
7         }
8     }

這時(shí)候的依賴關(guān)系應(yīng)該是像圖3這樣,

圖3

如何理解Lambda表達(dá)式和依賴倒置

感覺是不是很糟糕,沒關(guān)系,稍作修改,讓依賴合理的注入就可以完成解耦,

 1     public class IocController
 2     {
 3         private static IObjectFactory objectFactory;
 4 
 5         public static void SetObjectFactory(IObjectFactory objectfactory)
 6         {
 7             objectFactory=objectfactory;
 8         }
 9 
10         public static Entity GetEntity()
11         {
12             return objectFactory.CreateObject();
13         }
14     }

這個(gè)時(shí)候的關(guān)系依賴圖就像圖2所示的那樣了。 這里要說的就是在IocController中私有的靜態(tài)字段和靜態(tài)函數(shù)都可以轉(zhuǎn)為實(shí)例的,在IocController中定義一個(gè)靜態(tài)的IocController類型來實(shí)現(xiàn)自身的一個(gè)單例模式,然后調(diào)用實(shí)例方法。 因?yàn)槭莻€(gè)示例,著重于依賴注入的解釋就不完善這個(gè)類型了,就用語言描述一下, 這樣的設(shè)計(jì)的思路就類似于ASP.NETMVC中ControllerBuilder的樣子,也就是構(gòu)造函數(shù)注入。

看完上述內(nèi)容,你們掌握如何理解Lambda表達(dá)式和依賴倒置的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!

分享題目:如何理解Lambda表達(dá)式和依賴倒置
網(wǎng)站鏈接:http://bm7419.com/article14/ipoede.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈網(wǎng)站制作、全網(wǎng)營銷推廣外貿(mào)建站、定制開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營