最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#中委托用法實(shí)例分析

 更新時(shí)間:2015年05月07日 12:37:45   作者:小蘿莉  
這篇文章主要介紹了C#中委托用法,較為詳細(xì)的分析了C#中委托的概念與相關(guān)的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下

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

Delegate委托,在.NET中應(yīng)用的非常廣泛。會(huì)涉及到Lambda表達(dá)式,事件,匿名方法等。

那么何為委托?

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

下面我們來(lái)定義一個(gè)基本的委托:

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(); 
  Test.D_Math D = new Test.D_Math(t.Add);
  //委托實(shí)例化,也可Test.D_Math D =t.Add; 
  D += t.Cut;
  //委托可以以隊(duì)列方式執(zhí)行多個(gè)方法,
  //以+=運(yùn)算符或者-=來(lái)增加或者取消隊(duì)列中的方法 
  D(5, 6); 
 } 
}

以上看出來(lái)委托實(shí)用的地方了嗎?即委托可以執(zhí)行任何引入?yún)?shù)類(lèi)型相同且返回類(lèi)型相同的方法,甚至可以執(zhí)行簽名相同的方法隊(duì)列。

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

我們這里簡(jiǎn)單介紹一下協(xié)變與逆變的知識(shí)。

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

以下以兩個(gè)簡(jiǎn)單示例解釋協(xié)變與逆變:

協(xié)變:

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,此為協(xié)變。 
  } 
}

逆變:

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);
   //委托引入?yún)?shù)B,而Add方法參數(shù)為A類(lèi)型,此為協(xié)逆變。 
  } 
}

希望本文所述對(duì)大家的C#程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • VS2019打包WPF安裝程序最新教程(圖文詳解)

    VS2019打包WPF安裝程序最新教程(圖文詳解)

    這篇文章主要介紹了VS2019打包WPF安裝程序最新教程,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-11-11
  • C#中緩存的基本使用方法

    C#中緩存的基本使用方法

    項(xiàng)目開(kāi)發(fā)過(guò)程中緩存的應(yīng)用到處可見(jiàn),下面這篇文章主要給大家介紹了關(guān)于C#中緩存的基本使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-09-09
  • Unity實(shí)現(xiàn)毫秒延時(shí)回調(diào)功能

    Unity實(shí)現(xiàn)毫秒延時(shí)回調(diào)功能

    這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)毫秒延時(shí)回調(diào)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • C#編程自學(xué)之?dāng)?shù)據(jù)類(lèi)型和變量三

    C#編程自學(xué)之?dāng)?shù)據(jù)類(lèi)型和變量三

    C#語(yǔ)言類(lèi)型系統(tǒng)提出的一個(gè)核心概念裝箱(boxing)拆箱(unboxing)。裝箱和取消裝箱的概念是C#的類(lèi)型系統(tǒng)的核心。它在“值類(lèi)型”和“引用類(lèi)型”之間的架起了一座橋梁,使得任何“值類(lèi)型”的值都可以轉(zhuǎn)換為object類(lèi)型的值,反過(guò)來(lái)轉(zhuǎn)換也可以。
    2015-10-10
  • C#?WinForm實(shí)現(xiàn)檢查目標(biāo)IP端口是否可連接

    C#?WinForm實(shí)現(xiàn)檢查目標(biāo)IP端口是否可連接

    這篇文章主要為大家詳細(xì)介紹了如何基于C#?WinForm實(shí)現(xiàn)檢查目標(biāo)IP端口是否可連接的小工具,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-01-01
  • Unity技術(shù)手冊(cè)之Slider滑動(dòng)器使用實(shí)例詳解

    Unity技術(shù)手冊(cè)之Slider滑動(dòng)器使用實(shí)例詳解

    這篇文章主要為大家介紹了Unity技術(shù)手冊(cè)之Slider滑動(dòng)器使用實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • C#中命名參數(shù)和可選參數(shù)

    C#中命名參數(shù)和可選參數(shù)

    這篇文章介紹了C#中的命名參數(shù)和可選參數(shù),文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • C#使用Stopwatch實(shí)現(xiàn)計(jì)時(shí)功能

    C#使用Stopwatch實(shí)現(xiàn)計(jì)時(shí)功能

    在 C# 中,Stopwatch 類(lèi)是用于測(cè)量經(jīng)過(guò)的時(shí)間的工具類(lèi),提供了高精度的計(jì)時(shí)功能,本文主要介紹了C#如何使用Stopwatch實(shí)現(xiàn)計(jì)時(shí)功能,需要的可以參考下
    2024-03-03
  • c#字符串編碼問(wèn)題的處理解決

    c#字符串編碼問(wèn)題的處理解決

    這篇文章主要介紹了c#字符串編碼問(wèn)題的處理解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • 解決C#程序只允許運(yùn)行一個(gè)實(shí)例的幾種方法詳解

    解決C#程序只允許運(yùn)行一個(gè)實(shí)例的幾種方法詳解

    本篇文章是對(duì)C#中程序只允許運(yùn)行一個(gè)實(shí)例的幾種方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05

最新評(píng)論

中江县| 托克托县| 天水市| 中西区| 黑山县| 宁蒗| 临西县| 黔西县| 瓦房店市| 叶城县| 乐平市| 吐鲁番市| 育儿| 习水县| 东乡县| 兴化市| 民丰县| 汉中市| 汤阴县| 汉寿县| 张家口市| 依兰县| 潮州市| 安福县| 集安市| 高雄市| 永寿县| 肥乡县| 施甸县| 辉县市| 茌平县| 宣武区| 肥西县| 黑水县| 长子县| 黄冈市| 龙海市| 灵宝市| 精河县| 沭阳县| 武清区|