委託和事件
1、**型別
c++
和其他語言一樣可以通過函式指標來進行訪問,但在c#中取消了指標的概念,因為指標可能給程式的安全的安全性帶來隱患為了彌補知道指針對語言靈活性的影響,c#引入一種新的型別,即**(delegate)。但是在2.0中我們稱它委派。
2、委託概述
委託是一種引用型別,
一旦為委託分配了方法,委託將與該方法具有完全相同的行為。委託方法的使用可以像其他任何方法一樣,具有引數和返回值。例如:
public
delegate
string
handler(string str);
注意:1.
與委託的
簽名(由返回型別和引數組成)匹配的任何方法都可以分配給該委託。這樣就可以通過程式設計方式來更改方法呼叫,還可以向現有類中插入新**。只要知道委託的簽名,便可以分配自己的委託方法。
2.將方法作為引數進行引用的能力使委託成為定義**方法的理想選擇。
3.委託可以定義在命名空間裡面,也可以定義在類裡邊。
3、委託的特點(from msdn)
委託具有以下特點:
1.委託類似於c++ 函式指標,但它是型別安全的。
2.委託允許將方法作為引數進行傳遞。(重要應用之一)
3.委託可用於定義**方法。
4.委託可以鏈結在一起(多路廣播);例如,可以對乙個事件呼叫多個方法。
假如我們在開發的過程中,乙個類中要用的另外乙個類中的方法。那我們應該怎麼做呢?
有人說直接在那個類中定義方法就行呀,考慮到**重用性,此舉不妥。用介面,可以;匿名方法也行。但是考慮簡單的我們用委託(委託別人去辦)看看。(但這不是委託的最理想的應用)
4、如何實現委託
看這樣乙個用例:父母沒有時間來照顧孩子,我們來委託保姆來照看孩子。我們抽象一下:
public
class
parents
}public
class
amah
}呼叫看看:
amah
amah = new
amah();
//委託定義在parents類中
parents
.lookafterdelegate lookafter = new
parents.lookafterdelegate(amah.lookafterchild); daleagate.text= lookafter(12, 12).tostring();
結果:144
如果**在命名空間下:
amah
amah = new
amah();
delegateclass.lookafterdelegate lookafter = new
lookafterdelegate(amah.lookafterchild);
daleagate.text= lookafter(12, 12).tostring();
結果:144
5、多路廣播委託
上面的委託只包含了乙個方法,其實可以委託也可以包含多個方法。這些方法必須要有相同的返回值和引數列表且引數型別一致,這種委託就是多路廣播委託。多路廣播委託派生於system.multicastdelegate,它的combine方法允許把多個方法呼叫鏈結在一起,我們可以通過+=來向委託新增呼叫方法,也可以用-=刪除其中的呼叫方法。也可以通過+或者-來實現.用+ -和+=的區別是+-建立了新委託物件。
為了得到更好的體現,我們選擇控制台:
delegate
void
del(string s);//
定義委託
class
testclass
", s);
}static
void goodbye(string s)
", s);
}static
void
main()
}結果是:
呼叫委託
a:hello, a
呼叫委託
b:goodbye, b
呼叫委託
c:hello, c
goodbye, c
呼叫委託
d:goodbye, d
注意,多路廣播委託宣告時必須返回void,否則返回值不知道應該送回什麼地方。對此,我做了乙個測試:如果不將委託的宣告返回void,則返回值返回的是最後乙個鏈入委託鏈的方法的返回值,編譯不會出錯。
看下面的示例:
public
delegate
string
del(string s);
public
class
testclass
public
string goodbye(string s)
}protected
void page_load(object sender, eventargs e)
結果:helloa
goodbyeb
goodbyec
goodbyed
6、為什麼要用委託
使用委託使程式設計師可以將方法引用封裝在委託物件內。然後可以將該委託物件傳遞給可呼叫所引用方法的**,而不必在編譯時知道將呼叫哪個方法。與c或c++中的函式指標不同,委託是物件導向,而且是型別安全的。
委託和事件
主要過程如下 1.在後台 中,我們可以定義處理程式方法alartrang 2.然後定義委託,引用到處理程式方法的例項。3.最後將委託新增到事件中。從而,引發事件時就會呼叫相關的事件處理方法。若要使用在另乙個類中定義的事件,必須定義和註冊乙個事件處理程式。事件 處理程式必須具有與為事件宣告的委託相同的...
委託和事件
委託的宣告 public delegate void mydelegate string str 注1.委託的定義和方法的定義類似,只是在前面加了乙個delegate,但委託不是方法,它是一種型別。是一種特殊的型別,看成是一種新的物件型別比較好理解。用於對與該委託有相 同簽名的方法呼叫。2.委託相當...
事件和委託
事件是物件傳送的訊息,以發訊號通知操作的發生。操作可能是由使用者互動 例如滑鼠單擊 引起的,也可能是由某些其他的程式邏輯觸發的。引發事件的物件稱為事件傳送方。捕獲事件並對其作出響應的物件叫做事件接收方。在事件通訊中,事件傳送方類不知道哪個物件或方法將接收到 處理 它引發的事件。所需要的是在源和接收方...