接觸過boost的c++程式設計的朋友可能對boost::bind的印象比較深刻,通過它可以很容易的改變函式的引數個數,實現函式的委託封裝。在非同步程式設計中有著廣泛的應用。
在c#中卻沒有提供這一功能,然而,得益於c#強大而靈活的語法機制,我們可以用匿名函式很容易的模擬實現這一過程。
首先看一下如下三個函式:
static
int foo()
static
int foo1(int i)
static
int foo2(int i, int j)
對於這樣的三個函式,假如我們需要使用委託來呼叫它們,委託定義如下:
delegate
intfoohanlder(int x);
在一般情況下,這乙個委託只能呼叫foo1函式,如下所示:
foohanlder f1 = foo1;
在c++中,可以通過bind的封裝,使得foohanlder也能呼叫foo和foo2函式。偽**如下:
foohanlder f = bind(foo);
foohanlder f2 = bind(foo2, 3, _1);
雖然c#並不支援bind,我們卻可以用另外一種同樣優雅的方式實現同樣的效果:
foohanlder f = x => foo();
foohanlder f2 = x => foo2(3,x);
這裡其實就是通過c# lambda表示式對foo和foo2函式進行了一層封裝,構造乙個foohanlder形式的匿名函式,從而實現類似bind的功能。非常簡單易用。
ps:.net 2.0下可以通過匿名函式來實現同樣的效果,只不過可視性上比lambda表示式略差而已。
在Python中如何模擬實現指標
在python中模擬實現指標 因為python中的指標本身不存在,但並不意味著無法使用指標。實際上有多種方法可以在python中模擬指標。這裡用兩種方法來實現 使用可變型別作為指標 python中的變數 使用自定義python物件 python中的物件 使用可變型別作為指標 您已經了解了可變型別。因...
C 模擬實現List
雙向鍊錶 include includeusing namespace std typedef nodenode templatestruct node t data 鍊錶中的資料 node pnext 下乙個節點 node ppre 前乙個節點 templateclass list templat...
c 模擬實現堆
這次我們來模擬實現堆,首先堆是乙個完全二叉樹,每個元素都有乙個關鍵碼,儲存相應的資料,堆分為最大堆和最小堆。最大堆 最大堆任意乙個節點都大於它左右孩子的關鍵碼,堆頂元素最大。最小堆 最小堆任意乙個節點都小於它左右孩子的關鍵碼,堆頂元素最小。因此我們得出以下結論 堆儲存在下標為0開始計數的陣列中,因此...