當我剛學習C#是接觸事件時,就在思考它是怎樣一種機制,直到深入的接觸委託對事件有了更深刻的認識,這是一個回到函數,在.NET Framework 中運用的很廣泛,如表單狀態變化,菜單選項等等。那有沒有思考過它是如何?的那,這就要說到委託
,委託是一個類似於C中的函數指標的東西,但C#提供給委託更為安全的類型機制。
下面給大家掩飾一下委託的聲明建立和使用:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace MyDelegate
{
class Program
{
public delegate void FunBock(int value);
static void Main(string[]
args)
{
Program
p = new Program();
StaticDelegate();
instanceDelegate(p);
chainDelete(p );
}
public static void counter(int
from,int tow , FunBock
fb)
{
for
(int i = from; i <= tow; i++)
{
if (fb != null)
fb(i);
else
return;
}
}
// 代理靜態方法
public static void
StaticDelegate()
{
Console.WriteLine("-------------代理靜態函數----------------");
Program.counter(0,1,null);
Program.counter(0,
1, new FunBock(Program.StaticFunction ));
Console.WriteLine();
}
//代理執行個體方法
public static void
instanceDelegate(Program p )
{
Console.WriteLine("------------代理執行個體方法----------------");
Program.counter(0,
1, null);
Program.counter(0,
1, new FunBock(p.ObjectFunction
));
Console.WriteLine();
}
//代理串列函數
public static void
chainDelete(Program p )
{
Console.WriteLine("------------代理串列函數----------------");
FunBock
fb1 = null;
fb1 =(FunBock)Delegate.Combine(fb1, new
FunBock(p.ObjectFunction));
fb1 = (FunBock)Delegate.Combine(fb1,new
FunBock(Program.StaticFunction));
Program.counter(0,
1, fb1);
Console.WriteLine();
}
public void ObjectFunction(int
value )
{
Console.WriteLine("ObjectFunction方法 值是:" + value);
}
private
static void
StaticFunction(int value )
{
Console.WriteLine("StaticFunction方法 值是:" + value);
}
}
}
解析:delegate是委託聲明,聲明指定了一個委託函數的簽名。在本例中採用一個int的參數無傳回型別的委託,這就聲明了所有的無傳回型別的有一個int型別參數的所有函數都為它的指向值,類似與類與執行個體對象的概念,FunBock類,所有滿足約束條件的方法都可以看作這個類的執行個體!
關於chainDelete實現了鏈式的代理將在委託鏈中詳細講解!