C 學習筆記 七

2021-04-21 23:43:58 字數 3257 閱讀 2589

第七講 委託1 委託

是一種安全地封裝方法的型別,它與 c 和 c++ 中的函式指標類似。與 c 中的函式指標不同,

委託是物件導向的、型別安全的和保險的。委託的型別由委託的名稱定義。

下面的示例宣告了乙個名為 del 的委託,該委託可以封裝乙個採用字串

作為引數並返回 void

的方法。

public delegate void del(string message);

委託具有以下特點:

using system;

//建立乙個類

class mydelegate

static

void main() }

這個程式很簡單,就是為了列印張三吃食物。大家自己編譯執行下,不是很難理解。

結果是張三吃西瓜。下面我們來改下這段程式,通過委託的方法來呼叫張三吃東西

這個函式。

using system;

/// 

/// 宣告乙個eatdelegate這樣的委託

/// 委託的宣告首先使用了delegate關鍵字,然後是委託的返回值void,括號裡是委託的引數

/// 委託原型必須跟域委託的方法具有相同的返回值和引數(個數也必須一致)

/// 域委託的方法就是medelegate類下的void zseat(string food)方法

/// 委託的本質就是乙個類,任何可以宣告的地方都可以宣告委託

/// 

/// 

delegate

void eatdelegate(string food);

class mydelegate

static

void main() }

我們進行執行編譯**,結果和上面是一樣的。而這一次我們並沒有直接

使用zseat這個函式,而是通過**zs來呼叫它,它們的執行效果都是一樣

的。好,接下來張三乙個人吃西瓜覺得不過癮,我們新增李四等人,

**如下:

using system;

delegate

void eatdelegate(string food);

class mydelegate

//新增乙個李四吃東西函式

static

void lseat(string food)

//新增乙個王五吃東西函式

static

void wweat(string food)

static

void main() }

螢幕上也列印出來了張三,王五,李四都在吃西瓜,沒有什麼問題。

但是他們都在吃同一樣東西西瓜,為什麼我們要輸入三次呢?這樣

不是很麻煩嘛,有沒有什麼辦法可以只輸入一次西瓜,而同時都呼叫

了這3個函式了呢?有的,委託鏈可以實現這樣的功能。這也是委託一

個十分強大的地方,我們修改下**,宣告委託鏈:

using system;

delegate

void eatdelegate(string food);

class mydelegate

static

void lseat(string food)

static

void wweat(string food)

static

void main() }

我們儲存**執行,效果如下:

我們看,我們只使用了一次西瓜的引數,就讓張三李四王五同

時吃西瓜了。我們回過頭來再來看下**,(eatchain = zs + ls + ww)

在委託鏈eatchain中,只要把張三李四王五這幾個委託的例項加到

這個委託鏈裡面,之後向呼叫方法一樣呼叫這個委託鏈eatchain("西瓜"),它就會依次

按照上面加入的順序去執行這幾個委託所對應的函式了。

好,接下來我們把程式變得更具有邏輯性些:

using system;

delegate

void eatdelegate(string food);

class mydelegate

static

void lseat(string food)

static

void wweat(string food)

static

void main() }

我們來看下效果:

我們來看一下,前面他們3個人吃西瓜我們都理解了,這個時候李四

出去接**了.我們用乙個"-="將ls這個例項開除出eatchain這個

委託鏈,接著執行吃香蕉.我們可以在螢幕上看出只有張三和王五在

吃香蕉。這時李四又回來了,李四也要繼續吃東西eatchain += ls

把李四又加了進去,接著他們一起吃桔子eatchain("桔子"),我們看

結果他們3個人又都在一起吃桔子了。

c#其實過載了-=和+=這2個操作符來對委託鏈裡的元素進行加減操作,

從而使得我們可以隨意控制委託鏈裡的元素個數。

static

void zseat(string food)

static

void lseat(string food)

static

void wweat(string food)

向這樣只有幾句話的委託方法微軟提供了一種非常簡單的書

寫方式給我們,使得我們可以更方便的寫出委託,

下面我們來修改下**:

using system;

delegate

void eatdelegate(string food);

class mydelegate

; eatchain += delegate(string food) ;

eatchain += delegate(string food) ;

eatchain("西瓜"); } }

我們編譯執行可以得到張三李四王五都在吃西瓜。雖然我們沒有書寫

zseat(string food),lseat(string food),wweat(string food)

這些方法,但是呢我們把這些方法直接加到了委託鏈裡面。當委託鏈執行

的時候,得出了剛才一樣的效果(螢幕上3個人吃西瓜)。這個就是c#2.0新

增的匿名方法,它使的我們更加容易的去建立委託,有關匿名方法的講解

可以去msdn上的webcast網路講座上,李建忠老師的《c#2.0銳利體驗系

列課程》中的《匿名方法,迭代器》有深入詳細的講解,

c 學習筆記七

使用函式程式設計 程式的分解 1 函式 定義函式 函式頭格式 返回型別 函式名 引數列表 引數和變元 返回值 return 2 函式的宣告 函式的原型 函式的引數傳遞 按值傳送 給函式傳送指標 給函式傳遞陣列 常量指標引數 多維陣列引數 按引用傳送機制 例如 int num 10 int rnum ...

C 多執行緒學習筆記七

task int task task.factory.startnew task.wait console.writeline task.result task int task task.factory.startnew var task2 task.continuewith int t cons...

c 學習筆記(七) 再談迭代器

容器一般都會提供乙個迭代器,用於跟蹤元素操作。但是其實,標準庫所定義的迭代器不依賴於特定的容器。而容器所提供的迭代器也只是,標準庫提供的一下三種迭代器的一種 1 插入迭代器 這類迭代器與容器繫結在一起,實現在容器中插入元素的功能 2 iostream 迭代器 這類迭代器可與輸入或輸出流繫結在一起,用...