在研發(fā)期間,把寫代碼過程中較好的一些代碼段備份一下,下面的代碼是關(guān)于C#中的委托演示的代碼,應該能對小伙伴有些幫助车猬。
public class Test?
{?
? ? public delegate void D_Math(int a, int b);?
? ? public void Add(int a, int b)?
? ? {?
? ? ? ? Console.WriteLine("Add方法結(jié)果:{0}", a + b);?
? ? }?
? ? public void Cut(int a, int b)?
? ? {?
? ? ? ? Console.WriteLine("Cut方法結(jié)果:{0}", a - b);?
? ? }?
}?
[TestClass]?
public class UnitTest1?
{?
? ? [TestMethod]?
? ? public void TestMethod1()?
? ? {?
? ? ? ? Test t = new Test();?
? ? ? ? D(5, 6);?
? ? }?
}?
以上看出來委托實用的地方了嗎?即委托可以執(zhí)行任何引入?yún)?shù)類型相同且返回類型相同的方法尺锚,甚至可以執(zhí)行簽名相同的方法隊列珠闰。那么我們的方法簽名(即引入?yún)?shù)和輸出參數(shù))真的必須與委托完全一致嗎?答:不是的瘫辩,我們不能忽略協(xié)變與逆變伏嗜。我們這里簡單介紹一下協(xié)變與逆變的知識『贾欤“協(xié)變”是指能夠使用與原始指定的派生類型相比阅仔,派生程度更大的類型』⌒担“逆變”則是指能夠使用派生程度更小的類型八酒。那么,我們的委托也是接受協(xié)變與逆變的刃唐。意思是羞迷,如果定義一個delegate,那么不僅僅簽名完全相同的方法可以賦值給delegate變量画饥。如果一個方法的參數(shù)表符合delegate聲明衔瓮,但返回的類型是(delegate聲明返回類型)的派生類,那也可以將這個方法賦值給這個delegate變量抖甘。如果一個方法的返回類型符合delegate的聲明热鞍,但參數(shù)是(delegate聲明參數(shù)類型)的祖先類,那也可以將這個方法賦值給這個delegate變量。如果一個方法的參數(shù)和返回類型都符合上面兩行的假設薇宠,那也可以將這個方法賦值給這個delegate變量偷办。以下以兩個簡單示例解釋協(xié)變與逆變:協(xié)變:
? ? ? public class A { }?
? ? public class Test?
? ? {?
? ? ? ? public delegate A D_Math();?
? ? ? ? public B Add()?
? ? ? ? {?
? ? ? ? ? ? return new B();?
? ? ? ? }?
? ? ? ? public A Add2()?
? ? ? ? {?
? ? ? ? ? ? return new A();?
? ? ? ? }?
? ? }?
? ? [TestClass]?
? ? public class UnitTest1?
? ? {?
? ? ? ? [TestMethod]?
? ? ? ? public void TestMethod1()?
? ? ? ? {?
? ? ? ? }?
? ? }?
逆變:
public class A { }?
? public class Test?
? {?
? ? ? public delegate void D_Math(B b);?
? ? ? public void Add(B b)?
? ? ? {?
? ? ? }?
? ? ? public void Add2(A a)?
? ? ? {?
? ? ? }?
? }?
? [TestClass]?
? public class UnitTest1?
? {?
? ? ? [TestMethod]?
? ? ? public void TestMethod1()?
? ? ? {?
? ? ? }?
? }?
以上是本篇對于委托的講解,歡迎大家補充與修正澄港。