最近在看關於delegate委派的文章
一開始我以為翻過書了
範例也都看過了就應該懂了
就跳過去繼續看委派的應用callback
最近在看關於委派的文章
一開始我以為翻過書了
範例也都看過了就應該懂了
就跳過去繼續看委派的應用callback
不看還好,一看整個亂掉
後來決定重看並且上機寫sample
才比較能知道實際運作的狀況
然後假想狀況來應用等等
今天來報告一下心得
順便記下來以免忘記:P
簡單的說委派是拿來把方法當作參數一樣傳遞而用的
在MSDN上的解釋是這樣
委派是參考方法的一種型別,一旦將一個方法指定給某委派,則該委派的行為便會與該方法完全相同。
對於委派方法可以像其他任何方法一樣叫用 (Invoke),也有參數和傳回值
要使用委派的話必須要先定義委派要接受的方法要傳入的參數及是否有回傳值
就像這樣:
將他定義在您的程式可以呼叫到的地方
像cloudio現在建立的這個委派指名沒有傳回值並且只收會傳入一個string型態的參數的方法
然後我就可以去新增這個委派了
這邊的setTextBox就是剛剛講的那個會傳入一個string型態的參數的方法
被建立的委派一次不只可以接受一個方法您可以在鏈結其他方法給它
未來當委派被呼叫時會將所有已經接受的方法一一呼叫
所以這樣也是可以執行的:
cuCallBack += new UcCallBack(newSetTextBox);
最後當這委派被呼叫他就將setTextBox跟newSetTextBox兩個方法內的敘述式一起執行
如果您的setTextBox的內容為TextBox1.Text = Instring;
newSetTextBox的內容為TextBox2.Text = Instring;
那麼當您這樣:
TextBox1跟TextBox2的內容都會變Hello
那麼委派可以用在什麼地方呢
最典型的就是建立事件了
cloudio比較有興趣的是callback這種模式
寫jQuery的人應該都看過callback這字眼吧
例如show這個method就可以接受一個callback參數
代表當show這個method執行完之後要執行callback這參數中指定的method
C#中的委派實做callback也可以是類似這種方式
但是在C#中更可以跨類別傳委派來做callBack
會更有power
cloudio寫一個小範例利用UserControl來改變引用頁面的textbox中的文字
通常都是頁面改變被引用的UserControl內的內容...
首先cloudio先建立一個類別在app_code這類別中什麼也沒有
只有一行
然後建立一個UserControl跟一個引用該UserControl的aspx頁面
在UserControl中的內容像這樣:
/// 這個method是公開的,所以引用此UserControl的頁面可以呼叫它
/// </summary>
/// <param name="ucCallBack">要傳入的委派</param>
public void referenceCallBack(UcCallBack ucCallBack)
{
this.ucBackCall = ucCallBack;
}
/// <summary>
/// 在目前這裡呼叫此委派
/// </summary>
protected void Button1_Click(object sender, EventArgs e)
{
if (ucBackCall != null) {
ucBackCall(TextBox1.Text);
}
}
在default.aspx中這樣寫:
/// <summary>
/// 建立委派並指定方法給他
/// </summary>
protected void Page_Load(object sender, EventArgs e)
{
cuCallBack = new UcCallBack(setTextBox);
WebUserControl.referenceCallBack(cuCallBack);
}
/// <summary>
/// 供委派叫用方法
/// </summary>
protected void setTextBox(string Instring)
{
TextBox1.Text = Instring;
}
然後執行起來的畫面像這樣
點了UserControl的Buttom會呼叫default.aspx的setTextBox方法
而傳入setTextBox的參數是從UserControl來的
好玩:D
PS:callback是一對一的