表面上看來使用delegate是一件很簡單的事。
用delegate關鍵字定義,使用老套的new創建一個instance ,使用熟悉的方法調用寫法調用,只不過不在是方法名,而是委托名。 但是在這背後CLR為我們做了很多。 當我們 寫下下面這句話時 public delegate void FeedBack(Int32 val); 其實相當於 大概下面的代碼(省略部分多線程相關代碼) pubic class FeedBack:MulticastDelegate { public FeedBack(Object object , IntPtr methodPtr) { xxxx
也就是說委托的構造函數 完成了 和具體真實對象以及真實方法的對應,而調用則是另一個方法 Invoke(int32 val)。這個方法會觸發真實方法的調用。
public delegate void FeedBack <T>(T para);
public delegate void FeedBack<Tint,Tstr>(Tint para1,Tstr para2);
class 委托可以有泛型嗎
{
public static void Main(string[] args)
{
FeedBack<Int32 > fb = new FeedBack<int >(FeedBackInt);
FeedBack<String > fb2 = new FeedBack<string >(FeedbackString);
FeedBack<int ,string > fb3 = new FeedBack<int , string >(FeedbackIntString);
fb.Invoke(2);
fb2.Invoke( "haha");
fb3.Invoke(60,"haha" );
Console.ReadKey();
}
public static void FeedBackInt(Int32 val)
{
Console.WriteLine(val);
}
public static void FeedbackString(String str)
{
Console.WriteLine(str);
}
public static void FeedbackIntString(int val,string str)
{
Console.WriteLine(val+":" +str);
}
}
}
不知道看到這裡,你心裡會不會隱隱約約有一種想法。。。。那就是微軟所想到的:通過泛型可以把你編程幾乎會用到的所有可能的委托囊括!!!!
他們確實這樣做了。。這就是FCL 擁有的自建委托。不帶返回值的統稱 Action 帶返回值的統稱 Func. 自帶委托如下,參數最多
上限16個。再多的話,這個方法本身就很有問題了。
以及
微軟建議,在需要使用委托的時候就是用內建的這些委托,而不要再去自己創建委托類型了。那我們就遵守這個慣例吧。
當然 也有可能這些泛型不符合你需要的委托。 比如你需要這個
delegate void bar(ref int32 z); ,或者說你的泛型委托需要一些約束。那就得自己定義委托了。。