C#中委托用法實(shí)例分析
本文實(shí)例講述了C#中委托用法。分享給大家供大家參考。具體分析如下:
Delegate委托,在.NET中應(yīng)用的非常廣泛。會涉及到Lambda表達(dá)式,事件,匿名方法等。
那么何為委托?
通俗的來講,委托除了必須指定delegate關(guān)鍵字和沒有方法實(shí)體之外,和指定方法沒有更多區(qū)別。你可以當(dāng)它是一個(gè)占位符,比如你在寫代碼的時(shí)候并不知道你將要處理的是什么。你只需要知道你將要引入的參數(shù)類型和輸出類型是什么并定義它即可。這就是書本上所傳達(dá)的方法簽名必須相同的意思。
下面我們來定義一個(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)算符或者-=來增加或者取消隊(duì)列中的方法
D(5, 6);
}
}
以上看出來委托實(shí)用的地方了嗎?即委托可以執(zhí)行任何引入?yún)?shù)類型相同且返回類型相同的方法,甚至可以執(zhí)行簽名相同的方法隊(duì)列。
那么我們的方法簽名(即引入?yún)?shù)和輸出參數(shù))真的必須與委托完全一致嗎?答:不是的,我們不能忽略協(xié)變與逆變。
我們這里簡單介紹一下協(xié)變與逆變的知識。
“協(xié)變”是指能夠使用與原始指定的派生類型相比,派生程度更大的類型。
“逆變”則是指能夠使用派生程度更小的類型。
那么,我們的委托也是接受協(xié)變與逆變的。
意思是,如果定義一個(gè)delegate,那么不僅僅簽名完全相同的方法可以賦值給delegate變量。
如果一個(gè)方法的參數(shù)表符合delegate聲明,但返回的類型是(delegate聲明返回類型)的派生類,那也可以將這個(gè)方法賦值給這個(gè)delegate變量。
如果一個(gè)方法的返回類型符合delegate的聲明,但參數(shù)是(delegate聲明參數(shù)類型)的祖先類,那也可以將這個(gè)方法賦值給這個(gè)delegate變量。
如果一個(gè)方法的參數(shù)和返回類型都符合上面兩行的假設(shè),那也可以將這個(gè)方法賦值給這個(gè)delegate變量。
以下以兩個(gè)簡單示例解釋協(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類型,此為協(xié)逆變。
}
}
希望本文所述對大家的C#程序設(shè)計(jì)有所幫助。
相關(guān)文章
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ù)類型和變量三
C#語言類型系統(tǒng)提出的一個(gè)核心概念裝箱(boxing)拆箱(unboxing)。裝箱和取消裝箱的概念是C#的類型系統(tǒng)的核心。它在“值類型”和“引用類型”之間的架起了一座橋梁,使得任何“值類型”的值都可以轉(zhuǎn)換為object類型的值,反過來轉(zhuǎn)換也可以。2015-10-10
C#?WinForm實(shí)現(xiàn)檢查目標(biāo)IP端口是否可連接
這篇文章主要為大家詳細(xì)介紹了如何基于C#?WinForm實(shí)現(xiàn)檢查目標(biāo)IP端口是否可連接的小工具,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-01-01
Unity技術(shù)手冊之Slider滑動器使用實(shí)例詳解
這篇文章主要為大家介紹了Unity技術(shù)手冊之Slider滑動器使用實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
C#使用Stopwatch實(shí)現(xiàn)計(jì)時(shí)功能
在 C# 中,Stopwatch 類是用于測量經(jīng)過的時(shí)間的工具類,提供了高精度的計(jì)時(shí)功能,本文主要介紹了C#如何使用Stopwatch實(shí)現(xiàn)計(jì)時(shí)功能,需要的可以參考下2024-03-03
解決C#程序只允許運(yùn)行一個(gè)實(shí)例的幾種方法詳解
本篇文章是對C#中程序只允許運(yùn)行一個(gè)實(shí)例的幾種方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05

