首先,泛型委託是委託的一種特殊形式,雖然感覺看上去比較怪異,其實在使用的時候跟委託差不多,不過泛型委託更具有型別通用性。
就拿c#裡最常見的委託eventhandler打比方。在.net 2.0以前,也就是泛型出現以前,普通的事件處理函式都由eventhandler定義,如下:
public delegate void eventhandler(object sender, eventargs e);
eventhandler指代了這樣一類函式,這些函式沒有返回值,並且有兩個引數,第乙個引數是object型別,而第二個引數是eventarbxanwpiszgs型別。
而.net 2.0及其以後的版本,由於泛型的引入,所以一些內建(built-in)的類、介面、委託都有了各自的泛型版本。eventhandler也不例外,它有了自己的泛型版本:eventhandler,它的定義如下:
[serializable]
public delegate void eventhandler>(object sender, teventargs e) where teventargs: eventargs;
您應該可以發現,第二個引數的型別由eventargs變成了teventargs,而teventargs具體是什麼,則由呼叫方決定。假設inteventargs和stringeventargs都繼承於system.eventargs,那麼:
1.eventhandler指代這樣一類函式:這些函式沒有返回值,有兩個引數,第乙個引數是object型別,第二個引數是inteventargs型別
2.eventhandler指代這樣一類函式:這些函式沒有返回值,有兩個引數,第乙個引數是object型別,第二個引數是stringeventargs型別
其實eventhandler和eventhandler是兩個完全不同的委託,它們所指代的函式都分別有著不同的簽名形式。請參見下面的示例:
class inteventargs : system.eventargs
public inteventargs()
public inteventargs(int value)
}
class stringeventargs : system.eventargs
public stringeventargs()
public stringeventargs(string value)
}
class program
static void printstring(object sender, stringeventargs e)
static void main(string ar程式設計客棧gs)
}
泛型委託例項
先來看一下典型的window控制項的事件處理方式,舉兩個例子,乙個button的mouseclick事件,乙個linklabel的linkclicked事件 this button1.mouseclick new system.windows.forms.mouseeventhandler this...
C 基礎 泛型委託
泛型委託是委託的一種特殊形式,感覺看上去比較怪異,其實在使用的時候跟委託差不多,不過泛型委託更具有型別通用性。就拿c 裡最常見的委託eventhandler打比方。在.net 2.0以前,也就是泛型出現以前,普通的事件處理函式都由eventhandler定義,如下 view plaincopy to...
C 基礎 泛型委託
泛型委託是委託的一種特殊形式,感覺看上去比較怪異,其實在使用的時候跟委託差不多,不過泛型委託更具有型別通用性。就拿c 裡最常見的委託eventhandler打比方。在.net 2.0以前,也就是泛型出現以前,普通的事件處理函式都由eventhandler定義,如下 public delegate v...