C#中的委托
引言:C#中的委托著實讓我迷惑(我是位初學者),在不同的C#書籍中,還譯為代理、委派等,經反復查閱資料和自己動手編寫代碼,才稍稍理出點頭緒。
C#中的委托類似於C或C++中的函數指針,但兩者有本質區別:C或C++不是類型安全的,但C#中的委托是面向對象的,而且是類型安全的。
從技術角度來講,委托是一個引用類型,用來封裝帶有特定簽名和返回類型的方法。
1、聲明委托
C#使用關鍵字delegate來聲明委托類型:
[訪問修飾符] delegate 結果類型 委托標識符([形參列表]);
委托類型可以在聲明類的任何地方聲明。
2、實例化委托
委托使用new運算符來實例化。
新創建的委托實例所引用的對象為以下之一:
⑴委托創建表達式中引用的靜態方法
⑵委托創建表達式中引用的目標對象(此對象不能為null)和實例方法
⑶另一個委托
例如:
delegate void MyDelegate(int x);
class MyClass
{
public static void Method1(int i)
{
}
public void Method2(int i)
{
}
}
class TestClass
{
static void Main()
{
//靜態方法
MyDelegate delegate1=new MyDelegate(MyClass.Method1);
//實例方法
TestClass class1=new MyClass();
MyDelegate delegate2=new MyDelegate(MyClass.Method2);
//另一個委托
MyDelegate delegate3=new MyDelegate(delegate2);
}
}
3、使用委托
通過委托對象的名稱及放入括號的要傳遞給委托的參數來調用委托對象。調用委托時,調用表達式的主表達式必須是委托類型的值
以下是我寫的一個例子:
namespace delegateTest
{
public delegate int mydelegateTest(int i,int j);
class calculate
{
public static int add(int i,int j)
{
return i+j;
}
public static int minus(int i,int j)
{
return i-j;
}
}
class delegateapp
{
static void Main(string[] args)
{
mydelegateTest d0=new mydelegateTest(calculate.add);//聲明一個mydelegateTest的實例d0,並用calculate.add對其進行初始化,實際上就是將委托與方法鏈接起來。
int i=d0(99,1);//開始調用委托,就像是使用靜態成員方法calculate.add(int i,int j)一樣。
System.Console.WriteLine("這是運行add的結果:{0}",i);
mydelegateTest d1=new mydelegateTest(calculate.minus);
int j=d1(100,99);
System.Console.WriteLine("這是運行minus的結果:{0}",j);
System.Console.ReadLine();
}
}
}