標籤:
使用委託按照函數類型定義委託
委託的作用:1、動態調用函數
2、函數回調和事件機制的基礎
對於有C++經驗的人來說,可以把委託理解為函數指標;對於沒有C++經驗的人來說,委託可以理解為一種特殊的資料類型---函數的類型。
對於C#來說,和普通的資料類型一樣,函數也有類型,只不過函數的類型是通過函數的傳回值類型以及參數列表決定的,如果兩個函數的傳回型別,以及參數的順序和類型,參數的數量完全相同,那麼就可以說這兩個函數類型相同。
那麼,就可以用委託來表示某種特定類型的函數,並且可以表示多個函數,使用委託就好像調用這些函數,由於它可以串聯多個函數,所以就會按照串聯的順序依次調用這些函數,如果有傳回值,那麼將返回最後一個函數的傳回值。
委託既然可以理解為一種特定的類型,那麼,它實質上是一個類,編譯器會根據關鍵字“delegate”自動從System.Delegate類派生一個類,那麼,委託也可以有它的存取修飾詞,如private、public等,同業也有它自己的成員。
C#中用關鍵字“delegate”來定義委託(定義一種資料類型)
Delegate returntype DelegateName(Type1 para1,Type2 para2,…);
用委託動態調用函數
既然委託可以理解為一種特定的資料類型,那麼使用委託跟使用其他資料類型一樣,一般分為三個步驟:1、聲明委託變數,跟聲明普通類型的變數一樣。2、為委託變數賦值,委託變數可以看成是一個函數鏈表,可以通過”=“為函數鏈表指定唯一函數,也可以通過”+=“為函數鏈表指定多個函數,還一個通過”-=“從函數鏈表中刪除指定函數。3使用委託變數,像使用函數那樣直接使用委託變數,例如定義了一個委託變數voidFunc,那麼使用它的時候,直接”voidFunction()“,也可以通過調用委託變數的成員函數”invoke()“來使用委託變數,例如”voidFunc.Invoke()“。
用委託傳遞函數參數
在使用委託變數的時候指定參數而已。
例子
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DelegateApp
{
class Program
{
delegate void DSimpleVoidFunc();
delegate float DFloatFunc(int val1,float val2);
static void Main(string[] args)
{
DSimpleVoidFunc voidfun; //聲明委託變數
voidfun = PrintHaHa; //為委託變數賦值
voidfun(); //使用委託變數
voidfun += PrintHeHe;
voidfun();
voidfun -= PrintHeHe;
voidfun.Invoke();
UseParaDelegate();
Console.ReadLine();
}
static void PrintHaHa()
{
Console.WriteLine("HaHa...");
}
static void PrintHeHe()
{
Console.WriteLine("HeHe...");
}
static void UseParaDelegate()
{
DFloatFunc floatfunc;
float result;
floatfunc = Add;
result = floatfunc(5, 2.0f);
Console.WriteLine("1. Result={0}",result);
floatfunc += Sub;
result = floatfunc(5, 2.0f);
Console.WriteLine("2. Result={0}", result);
floatfunc += Mul;
result = floatfunc(5, 2.0f);
Console.WriteLine("3. Result={0}", result);
floatfunc -= Mul;
floatfunc += Add;
result = floatfunc.Invoke(5,2.0f);
Console.WriteLine("4. Result={0}", result);
}
static float Add(int val1,float val2)
{
Console.WriteLine("{0}+{1}={2}", val1, val2, val1 + val2);
return val1 + val2;
}
static float Sub(int val1,float val2)
{
Console.WriteLine("{0}-{1}={2}", val1, val2, val1 - val2);
return val1 - val2;
}
static float Mul(int val1,float val2)
{
Console.WriteLine("{0}*{1}={2}", val1, val2, val1 * val2);
return val1 * val2;
}
}
}
C# 關於委託的一點心得