C#委托(Delegate)
在C#的學習程序中,自然有我們的精神小伙——委托 的一席之地
本文就介紹一下C#中的委托,這位可以包含同類方法函式的小伙子
C# 中的委托(Delegate)類似于 C 或 C++ 中函式的指標, 委托(Delegate)
是存有對某個方法的參考的一種參考型別變數,參考可在運行時被改變, 委托就是用來儲存方法的結構
委托(Delegate)特別用于實作事件和回呼方法,所有的委托(Delegate)都派生自 System.Delegate 類,
宣告和定義委托分為4個步驟
- 宣告一個委托(函式指標)
- 創建委托物件
- 創造符合委托格式的函式(指標指向的函式)
- 將函式名稱賦值給委托
Tips:委托物件為空是不能執行的,執行前先提前判斷
代碼實體如下
// 1. 宣告一個委托(函式指標)
delegate void delegateTest(int a,float b);
// delegate 回傳值型別 委托型別名(引數串列):
// 2. 創建委托物件
public delegateTest dT1;
//3. 創造符合委托格式的函式(指標指向的函式)
public void Test(int a,float b)
{
a+=100;
b*=2.0;
Console.WriteLine("a:{0},b:{1}", a,b);
}
static void Main(string[] args)
{
// 4. 將函式名稱賦值給委托
dT1=new delegateTest(Test);
//使用委托
dT1(1,1.0);
//列印結果
//a=101,b=2.0
}
委托型別
- 委托/代理:句柄
- 委托是自定義型別
- 委托是參考型別
幾種基礎的委托結構
- 自定義委托 語法: delegate 回傳型別 委托名([引數]);
- Action內置委托 語法: Action<[引數型別0-16個]> 委托名=被委托方法名;
- Func內置委托 語法: Function<[引數型別0-16個],回傳型別> 委托名=被委托方法名;
- 多播委托 語法:委托名+=被委托方法名;委托名-=被委托方法名;
委托的用法
下面的實體演示了委托的一個用法,可以將定義的委托作為引數,就可以直接通過委托來呼叫委托中的方法了,
//宣告委托
public delegate void OndelegateTest(int a,int b);
public static void TestNum1(int i,int j)
{
int num = i+j;
Console.WriteLine("num:"+num);
}
public static void TestNum2(int i,int j)
{
int num = i*j;
Console.WriteLine("num:"+num);
}
// 該方法把委托作為引數,并使用它呼叫方法
public static void sendNum(OndelegateTest test)
{
test(1,2);
}
static void Main(string[] args)
{
OndelegateTest d1=new OndelegateTest(TestNum1);
OndelegateTest d2=new OndelegateTest(TestNum2);
sendNum(d1);
sendNum(d2);
Console.ReadKey();
}
委托的多播(Multicasting of a Delegate)
委托物件可使用 “+” 運算子進行合并,一個合并委托呼叫它所合并的兩個委托,只有相同型別的委托可被合并,"-" 運算子可用于從合并的委托中移除組件委托,
使用委托的這個有用的特點,您可以創建一個委托被呼叫時要呼叫的方法的呼叫串列,這被稱為委托的 多播(multicasting),也叫組播,下面的程式演示了委托的多播:
using System;
//宣告委托
delegate int NumberChanger(int n);
namespace DelegateAppl
{
class TestDelegate
{
static int num = 10;
public static int AddNum(int p)
{
num += p;
return num;
}
public static int MultNum(int q)
{
num *= q;
return num;
}
public static int TestNum(int i)
{
num -= i;
return num;
}
public static int getNum()
{
return num;
}
static void Main(string[] args)
{
// 創建委托實體
NumberChanger nc;
NumberChanger nc1 = new NumberChanger(AddNum);
NumberChanger nc2 = new NumberChanger(MultNum);
nc = nc1;
nc += nc2;
nc += TestNum;
// 呼叫多播
nc(5);
Console.WriteLine("Value of Num: {0}", getNum());
Console.ReadKey();
}
}
}
當上面的代碼被編譯和執行時,它會產生下列結果:
Value of Num: 70
委托物件的系結與解綁
delegate int NumberChanger(int n);
NumberChanger nc;
public static int TestNum(int i)
{
num -= i;
return num;
}
nc += TestNum;//委托的系結
nc -= TestNum;//委托的解綁
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/276292.html
標籤:其他
