今天,我學習了一下MSDN上面委託這一章的內容。雖然自己以前雖然看到看過一些webcast關於委託方面的一些視頻,也在網上看過一些相關的介紹,但是一直沒有弄清楚委託到底是怎麼一回事。今天花了一天時間,我終於可以解開她神秘的外紗。
委託,英文名稱為delegate,中文可以翻譯為代表,代理。顧名思義,委託和為她分配的方法具有完全相同的行為。委託是一種引用方法的類型,因而它是參考型別的一種。與其他的參考型別不同,委託是對方法的引用。它代替了C++的函數指標。因為在C#中,方法是封裝在類裡面的,所以它是物件導向的,是型別安全的。
要使用委託,一般有以下三個步驟:
1.聲明委託
下面的語句聲明一個新的委託類型
public delegate int PerformCalculation(int x,int y)
這個委託類型的存取修飾詞是public.為什麼要設為public呢?因為建立委託,就是希望在外部類裡面通過委託調用它所封裝的方法,所以存取修飾詞一般就是public.這一點和私人欄位對應的屬性的存取修飾詞一般設為public道理是相同的.delegate是建立委託類型的關鍵字,這是C#文法所規定好了的。int PerformCalculation(int x,int y)統稱為委託的簽名。int為該委託類型的傳回型別.PerformCalculation為委託名.因為委託名決定了一個委託名決定委託的類型,所以取什麼樣的委託名,就建立了什麼樣的委託類型。這個例子就建立了一個PerformCalculation委託類型。當然委託名的命名要有實際意義,才能方便以後對它的調用.(int x,int y)是此委託類型的參數列表,包括了參數類型、參數名稱和參數的數目.從委託的聲明看來,委託和類等其他參考型別最大的區別是多了一個傳回型別和參數列表。傳回型別和參數列表共同構成了委託的簽名。這裡要注意的是,與在方法重載的上下文,方法簽名不帶傳回型別不同,在委託的上下文中,委託簽名是帶傳回型別的。為委託封裝的方法的傳回型別和參數列表必須與委託簽名匹配,但可以不完全符合,如委託的封裝方法的傳回型別是對應的委託的傳回型別的衍生類別型,方法的參數名稱也可以和委託簽名不同,不過參數類型必須相同。
聲明了委託只是建立了一種委託類型,要使用它,我們接下來必須對它進行執行個體化。認真想一想,這和我們建立了一個類,我們必須建立類的執行個體,才能訪問類裡面的執行個體成員是一個道理。
2.執行個體化委託
聲明了委託類型後,必須建立委派物件並使之與特定方法關聯。
下面的語句將步驟1建立的委託PerformCalculation執行個體化:
執行個體化委託有三種方法:
1).使用命名方法執行個體化
委託可以與命名方法關聯。使用命名方法對委託進行執行個體化時,該方法將作為參數傳遞
int Calculate(int x,int y) {/*……*/}
PerformCalculation pc = new PerformCalculation(obj.Calculate)
或PerformCalculation pc = obj.Calculate
2).使用匿名方法執行個體化
在不希望付出建立新方法的系統開銷時,C# 使您可以對委託進行執行個體化,並立即指定委託在被調用時將處理的代碼塊。這些被稱為匿名方法
PerformCalculation pc = delegate(int m,int n){/*……*/}
3).使用Lambra運算式
“Lambda 運算式”是一個匿名函數,它可以包含運算式和語句,並且可用於建立委託或運算式分類樹類型。
PerformCalculation pc = x->x*y
3.調用委託
通過委派物件的名稱(後面跟著要傳遞給委託的參數,括在括弧內)調用委派物件
pc (5,6)
由於沒有應用委託進行過開發,缺乏相應的經驗,對委託的應用還有很多不清楚的地方,期待在以後的工作學習中去挖掘!