天天看點

C#基礎系列——委托實作簡單設計模式

前言:上一篇介紹了下多線程的相關知識:C#基礎系列——多線程的常見用法詳解,裡面就提到了委托變量。這篇簡單介紹下委托的使用。當然啦,園子裡面很多介紹委托的文章都會說道:委托和事件的概念就像一道坎,過了這個檻的人,覺得真是太容易了,而沒有過去的人每次見到委托和事件就覺得心裡發慌。确實這東西就像最開始學C語言的指針一樣,令人有一種很糾結的感覺,總覺得要調用一個方法直接調用就行了,為啥非要定義一個委托時執行這個方法呢。其實在C#裡面很多的技術都是為了重用和簡化代碼而生,委托也不例外,很多使用C#多态去實作的設計模式其實都可以使用委托的方式去改寫,可以了解為一種輕量級的設計模式吧。部落客打算抽一篇專門分享下多态和委托實作設計模式的異同。這篇就先介紹簡單委托的使用。

一、什麼是委托:C# 中的委托(Delegate)類似于 C 或 C++ 中函數的指針。用部落客的話說,委托就是一種允許将方法名稱作為參數傳遞的引用類型。它定義的是方法的類型,可以說就是方法的抽象,那麼反過來說,方法可以了解為委托的執行個體,如public delegate void TestDelegate(string str);這種委托定義的就是所有參數類型為string,沒有傳回值的方法的一種抽象。

二、為什麼要使用委托:記得部落客剛開始做項目的時候看到委托的寫法就頭大,總覺得這是沒事找事,唯一的好處貌似就是代碼看上去很酷~~随着工作的累積,發現項目中某些小的需求使用這種輕量級的委托來實作的時候确實能減少很多代碼量。

三、委托的使用:

1、.Net Framework 裡面的委托類型:使用過委托的朋友可能注意到了C#裡面定義了兩種類型的委托變量,基本能滿足我們的一般需求。

(1)Action類型的委托:C#裡面定義Action委托用于抽象化那種沒有傳回值的方法。将Action變量轉到定義可知它的最簡單形式:

它定義是就是一種沒有傳回值沒有參數的委托。同時Action還提供了16個泛型的委托,用于定義方法的傳入參數:

C#基礎系列——委托實作簡單設計模式

我們來看他們的使用方法,我們首先定義測試的方法:

調用:

(2)Func類型的委托:還記得Linq裡面的擴充方法Where()、Select()等方法的參數嗎。public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)。這裡的參數就是一個Func類型的委托。C#裡面Func類型的委托用于處理有參數有傳回值的方法。不多說,上代碼:

知道了Func的方法就可以推想到我們神奇的lamada表達式了,其實lamada表達式就是一個匿名的委托。

這個Where裡面的lamada表達式我們把他拆解:

是不是一樣一樣的~~ 

2、自定義委托:

其實很多人應該都自己寫過Action、Func類型的委托。其實自己定義一個泛型委托也很簡單:

其實使用起來和系統的Action和Func基本沒有差別。

3、委托的合并和拆解就放在事件裡面分享了。這篇且過之。。。

4、如果按照上面的方法去使用委托,那真的是要别扭死人了,因為調用方法直接用方法名調用就好了,何必還要定義一個委托變量去調用,這不是将簡單問題複雜化麼。确實,上面隻是為了介紹委托而寫的代碼,實際項目中肯定不會這麼用。其實委托在項目中一般用在将委托變量作為參數傳遞或者函數回調。來看下面代碼:

得到結果:

C#基礎系列——委托實作簡單設計模式

public string ProcessFunc(string s1, string s2, MyDelegate process)裡面定義了一個回調函數,可以将任意一個符合這個委托的方法傳遞進去,得到想對應的結果。細看這種設計是不是和工廠設計模式十分相似,我簡單構造了個工廠:

得到結果和上面相同:

C#基礎系列——委托實作簡單設計模式

這樣一比較是不是對委托的用法有點感覺了呢~~如果你不怕麻煩,可以在項目是用起來試試,相信你會有收獲~~

示例下載下傳