委託的用法很多:一般是用於聲明事件和回調的委託,還可以是用於代表方法標簽的委託.
書本上的委託只是對委託的定義與具體怎樣調用問題,沒有涉及到委託的真正實用的地方。其實委託是與事件和回調
一起來使用的,你可以看一下C#非同步調用,與多線程處理里等就可以看到委託的作用了。
下面是別人的理解我覺得還是比較好的:
1)有了委託你就可以把方法看作像常數一樣,而委託就是該常數類型的變數.
從這個角度看來用於聲明事件的委託就是聲明這個事件觸發以後所調用的方法的標簽或者特徵.只有符合該標簽(參數個數和參數類型)的方法才可以做為該用於該事件的回調.
一個事件觸發了,你可能需要用多個方法處理該事件或者說該事件調用了多個方法(每個事件的實例都有一個需要調用的方法列表,當事件觸發它會逐個調用列表中的每個方法)
2)通過使用委託你可以實現對方法變化的封裝.
打個比方:如果你騎自行車,你需要有騎自行車的方法DriveBike().如果你騎摩托車你需要有騎摩托車的方法.現在你有一個方法DriveMoto.現在你需要定義一個方法,實現你騎(自行車或者摩托車)到某地DriveTo(地點,騎的方式)
騎的方式這里其實就是委託.在使用的時候,如果你是騎自行車你就用DriveBike實例化委託的實例帶入DriveTo方法,如果你騎摩托車你就用DriveMoto實例化"騎的方式"這個委託帶入DriveTo方法.
㈡ c#委託鏈的問題
你的委託d1上的確已經掛上了兩個方法,當d1被調用的時候,那兩個方法也的確都被觸發調用到了。
不過多個方法有多個返回值,而只有一個變數來接受,所以後面被調用的方法的返回值,就把前面方法的返回值覆蓋掉了。換句話說,前面的返回值都被丟棄掉了。
這也是定義事件委託的時採用void作為返回值的原因。
【回答補充】
你可以去看看系統類庫提供的委託/事件,都是void返回類型的。
如果你非要做一個帶返回值的委託,那可以這樣做了:
......
public string CreateDelegate()
{
Class1 c1 = new Class1();
MyDelegate d1 = new MyDelegate(c1.delegateMethod1);
d1 += c1.delegateMethod2;
string d = "";
foreach (MyDelegate x in d1.GetInvocationList())
{
d += x("Hello World");
}
return d;
}
......