C#委託
Firstly,let us look back on function pointer in c, the following is an example.
Function Pointer
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
int (*Test)(int l); //定義函數指標
int Add(int t)
{
return t+t;
}
int Mut(int t)
{
return t*t;
}
//把函數做參數
int test2(int t,int (*p)(int))
{
return p(t);
}
int _tmain(int argc, _TCHAR* argv[])
{
char input[8];
printf("Please Input a Number!\n");
scanf("%s",input);
int t=atoi(input);
int p;
if(t>10)
{
Test=Add; //指標執行Add
}
else Test=Mut; //指標指向Mut
p=Test(t); //通過指標調用
printf("The Result is %d\n",p);
if(t>10)
{
p=test2(t,Add);
}
else p=test2(t,Mut);
printf("The Result is %d\n",p);
system("pause");
return 0;
}
一、委託
委託類似於函數指標,但函數指標只能引用靜態方法,而委託既能引用靜態方法,也能引用執行個體方法。
委託使用分三步:1、委託聲明。2、委託執行個體化。3、委託調用。
二、例子:
delegate int NumOpe(int a,int b); //第一步,聲明委託
class Class1
{
static void Main(string[] args)
{
Class1 c1 = new Class1();
NumOpe d1 = new NumOpe(c1.Add);//委託執行個體化,注意參數是要使用的方法名,且不帶括弧
Console.WriteLine(d1(1, 2));//委託調用
Console.Read();
}
private int Add(int num1, int num2)
{
return (num1 + num2);
}
} */
/*例中,委託NumOpe引用了方法Add
委託聲明了以後,就可以像類一樣進行執行個體化,委託本身就是處在類層級上的 。執行個體化時把要引用的方法作為參數,這樣
委託和方法就關聯了起來,就可以用委託來引用方法了。
委託和所引用的方法必須保持一致。
1、參數個數、類型、順序必須完全一致。
2、傳回值必須一致。
**/
/*
下面再看一個委託的樣本。
* */
public delegate void PrintHandler(string str);//聲明委託類型
public class PrintStr
{
public void CallPrint(string input)
{
Console.WriteLine(input);
}
public void CallPrint1(string input)
{
Console.WriteLine(input);
}
}
class Program
{
static void Main1(string[] args)
{
PrintStr myPrinter = new PrintStr();
PrintHandler myHandler = null;
//將委託連結到方法,來執行個體化委託
myHandler += new PrintHandler(myPrinter.CallPrint);
myHandler += new PrintHandler(myPrinter.CallPrint1);
//不使用“=”是因為這樣會覆蓋掉以前註冊的方法
if (myHandler != null)
{
myHandler("Hello World!"); //調用委託,相當於匿名調用委託所連結的方法
}
myHandler -= new PrintHandler(myPrinter.CallPrint);
if (myHandler == null)
{
Console.WriteLine("myHandler==null");
}
else
{
myHandler("最後的一個方法");
myHandler -= new PrintHandler(myPrinter.CallPrint1);
Console.WriteLine("把最後的一個也去掉");
if (myHandler == null)
{
Console.WriteLine("myHandler==null");
}
else Console.WriteLine("還有一個");
}
Console.Read();
}
}//那什麼時候該使用委託呢?一個經典回答:若A變動,一系列的B,C,D,E,F將變動,可使用委託。
}