不知不覺,又開始委託的學習了,感覺這個東西我能學一輩子,哈哈哈!這次看的是官方的參考書(c#高編9),每次看不同的資料,總能學到不同的知識!言歸正傳
1、為什麼要使用委託?
我們習慣於將資料作為引數傳遞給方法,但是很多時候我們需要將乙個方法傳遞給另乙個方法。所以委託就是幹這個的,將方法作為引數,傳遞給另一方法.
舉個例子:在c#中,可以告訴計算機並行執行某些新的執行序列,同時執行當前任務,這個序列就稱之為執行緒,如果要告訴計算機啟動乙個新的執行緒,就必須告訴執行緒入口方法在**,並告訴計算機開始啟動方法的細節,所以執行緒(thread)的建構函式必須帶有乙個引數,該引數定義了執行緒呼叫的方法。這裡就使用到了委託的概念,將方法傳遞給執行緒!
2、委託的特性
在c和c++中,只能提取函式的位址,該位址可以作為引數傳遞給任何需要它的函式,這種方法會導致型別安全問題。但是在.net framework中,當我們進行物件導向程式設計的時候,幾乎沒有方法是孤立存在的,當我們吊用乙個方法前,必須確保這個方法與類例項關聯,所以在.net framework中不允許直接使用方法,或者傳遞方法,如果需要傳遞方法,那麼必須把該方法的細節和引數封裝在乙個類物件中,通過傳遞物件例項的方式,來傳遞方法。但是用類物件來傳遞方法,有點大材小用了,所以.net framework中定義了一種新的型別物件-委託,這種物件專門用來傳遞方法,如果我們要傳遞乙個方法,就必須把方法的細節封裝到委託中。通過委託例項來傳遞方法,所以委託和類其實在某種程度上說是一樣的,委託是一種特殊的類。這種類,專門負責傳遞方法。
3、宣告委託
2中,提到了委託其實是一種特殊的類,所以它的申明方式和類其實是差不多的,只不過類用class來修飾,且類有方法體,而委託使用delegate來修飾沒有方法體,委託必須宣告委託所代表的一類方法的返回值,並且宣告這類方法的引數,**如下:
public乙個無返回值,帶乙個int引數的委託申明好了。delegate
void mydeleagte(int a);
如果要定乙個委託,不帶引數,返回乙個string型別的值,**如下:
public4、委託的結構delegate
string mydelegate();
當我們定義完乙個委託,實際上是定義了乙個類,委託實現為派生自system.multicastdelegate抽象類的類,system.multicastdelegate又派生字system.delegate,c#編譯器能識別這個類,會使用其委託語法.
5、委託中註冊的方法的使用
委託中方法的呼叫有兩種方式:
a、委託變數加括號的方式,**如下:
publicb、使用invoke()方法delegate
void
getstring();
class
program
static
void
aa()
}
public上面是最常規的委託使用方法,當然還有其他的如:begininvoke()等,這裡不做解釋,如想要了解,請參考c# 委託高階delegate
void
getstring();
class
program
static
void
aa()
}
6、多播委託
上面的例項中,我給乙個委託繫結了多個方法,如果要多次呼叫這些方法,就需要顯示多次吊用。我們把乙個委託,如果這個委託繫結了多個方法,稱為多播委託,如果呼叫多播委託,就可以按順序連續吊用多個方法。為此,委託的簽名必須返回void,否則就只能得到最後乙個方法的返回值。
class上面是最基本的使用多播委託的方法,但是它存在以下問題program
static
void mutiplybytwo(double
a) gives
", a, a * 2
); }
static
void square(double
a) gives
", a, a *a);}}
a、對同乙個委託呼叫方法鏈的順序並未正式定義,因此應避免編寫依賴於特定順序的呼叫方法的**。
b、通過乙個委託呼叫多個方法還可能導致大問題,當乙個方法丟擲異常,整個迭代就會停止
b的實現**如下:
classprogram
static
void mutiplybytwo(double
a) gives
", a, a * 2
);
throw
new exception("
我出異常啦");
第二行**並沒有正常輸出,ok,那麼將異常捕獲,看它會不會執行第二行**,**如下:
classprogram
catch
(exception ex)
console.readline();
}static
void mutiplybytwo(double
a) gives
", a, a * 2
);
throw
new exception("
我出異常啦");
異常**獲,但是第二行**還是沒有執行,這是因為第乙個方法丟擲了異常,所以委託的迭代會停止,不再呼叫下面的方法。
b的解決方法:
為了解決上面的問題,delegate類定義了getinvocationlist方法,他返回乙個delegate陣列。現在可以使用物件吊用委託對應的方法,捕獲異常,並進行下一次迭代,**如下:
classprogram
catch
(exception)
}console.readline();
}static
void mutiplybytwo(double
a) gives
", a, a * 2
);
throw
new exception("
我出異常啦");
ok,問題解決,異常順利的捕獲,且委託的迭代正常完成!
C 委託基礎1 委託基礎
委託和其委託的方法必須具有相同的簽名。簽名相同 1.引數型別相同 2.引數數量相同 3.返回值一致 例一 class program static void main string args mm 7,6 console.readline 例二 class program double subtra...
c 委託基礎
委託 1.概念 委託是函式的封裝,它代表一 類 函式。它們都符合一定的簽名 擁有相同的引數列表 返回值型別。同時,委託也可以看成是對 函式的抽象,是函式的 類 2.語法 delegate argument list 3.用法 1.宣告委託,比如 public delegate void del st...
C 基礎 委託
一 委託 當我們需要把方法做為引數傳遞給其他方法的時候,就需要使用委託。因為有時候,我們要操作的物件,不是針對資料進行的,而是針對某個方法進行的操作。我們還是來以 入手 using system using system.collections.generic using system.linq u...