国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C#中委托用法實例分析

2020-01-24 01:52:39
字體:
來源:轉載
供稿:網友

本文實例講述了C#中委托用法。分享給大家供大家參考。具體分析如下:

Delegate委托,在.NET中應用的非常廣泛。會涉及到Lambda表達式,事件,匿名方法等。

那么何為委托?

通俗的來講,委托除了必須指定delegate關鍵字和沒有方法實體之外,和指定方法沒有更多區別。你可以當它是一個占位符,比如你在寫代碼的時候并不知道你將要處理的是什么。你只需要知道你將要引入的參數類型和輸出類型是什么并定義它即可。這就是書本上所傳達的方法簽名必須相同的意思。

下面我們來定義一個基本的委托:

public class Test {  //定義委托  public delegate void D_Math(int a, int b);  public void Add(int a, int b)  {   Console.WriteLine("Add方法結果:{0}", a + b);  }  public void Cut(int a, int b)  {   Console.WriteLine("Cut方法結果:{0}", a - b);  } } [TestClass] public class UnitTest1 {  [TestMethod]  public void TestMethod1()  {   Test t = new Test();   Test.D_Math D = new Test.D_Math(t.Add);  //委托實例化,也可Test.D_Math D =t.Add;   D += t.Cut;  //委托可以以隊列方式執行多個方法,  //以+=運算符或者-=來增加或者取消隊列中的方法   D(5, 6);  } }

以上看出來委托實用的地方了嗎?即委托可以執行任何引入參數類型相同且返回類型相同的方法,甚至可以執行簽名相同的方法隊列。

那么我們的方法簽名(即引入參數和輸出參數)真的必須與委托完全一致嗎?答:不是的,我們不能忽略協變與逆變。

我們這里簡單介紹一下協變與逆變的知識。

“協變”是指能夠使用與原始指定的派生類型相比,派生程度更大的類型。
“逆變”則是指能夠使用派生程度更小的類型。
那么,我們的委托也是接受協變與逆變的。
意思是,如果定義一個delegate,那么不僅僅簽名完全相同的方法可以賦值給delegate變量。
如果一個方法的參數表符合delegate聲明,但返回的類型是(delegate聲明返回類型)的派生類,那也可以將這個方法賦值給這個delegate變量。
如果一個方法的返回類型符合delegate的聲明,但參數是(delegate聲明參數類型)的祖先類,那也可以將這個方法賦值給這個delegate變量。
如果一個方法的參數和返回類型都符合上面兩行的假設,那也可以將這個方法賦值給這個delegate變量。

以下以兩個簡單示例解釋協變與逆變:

協變:

public class A { } public class B:A { }//B繼承自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()   {    Test.D_Math d = new Test.D_Math(new Test().Add);   //委托返回A,而Add方法返回B,此為協變。   } }

逆變:

public class A { } public class B:A { }//B繼承自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()   {    Test.D_Math d = new Test.D_Math(new Test().Add2);   //委托引入參數B,而Add方法參數為A類型,此為協逆變。   } }

希望本文所述對大家的C#程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 富顺县| 金溪县| 建昌县| 安多县| 思茅市| 武胜县| 陆河县| 黎平县| 巩留县| 呼玛县| 屏山县| 通许县| 玛纳斯县| 开封县| 乳源| 阳谷县| 康马县| 花莲县| 汝阳县| 朝阳区| 西平县| 衡阳市| 客服| 罗源县| 临沭县| 舞阳县| 湘乡市| 门源| 临西县| 建宁县| 施秉县| 古浪县| 兴和县| 拉孜县| 天津市| 县级市| 方城县| 都江堰市| 招远市| 鱼台县| 东方市|