程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C#委派

C#委派

編輯:關於C語言
委派

委派是C#引入的一種新的數據類型,它非常類似於C/C++中的函數指針,常常用於在編譯時未綁定的動態方法調用。與函數指針不同的是委派在C#中完全實現了面向對象,它既可以引用靜態方法,也可以引用實例方法,而函數指針只能引用靜態方法。C#中的委派同時也是類型安全的。

作為一種面向對象的數據類型,委派的使用分為三步:委派聲明,委派實例化和委派調用。委派聲明就是定義一個封裝特定參數類型和返回值類型的方法體(靜態方法或實例方法)的數據類型,看下面的示例:

delegate int Compute (int left, int right);

可以看到,委派類型Compute包含了方法的兩個要素: 參數類型和返回值類型。委派類型和方法只有滿足下面兩個條件,才能說它們是兼容的:

1. 參數的數量相同,並且它們的類型也按順序相同;

2. 返回值相同。

委派類型相同指的是它們聲明的類型為同一類型(名字一樣)。而委派實例相等則是指它們綁定的方法為同一個方法,或相同的方法按相同的順序組成的方法鏈,而它們本身的類型只要兼容即可(同樣滿足上面兩個條件),不必強求同名。

委派實例化就是將委派類型綁定到特定方法的過程,和其他對象的實例化相似,都需要用new語句,只是必須接受和該委派類型兼容的方法名作為new語句的參數。如果是實例方法,必須采用兩者中間加點號的方式同時提供實例對象和方法。

委派實例化後就可以像調用方法一樣進行委派調用了。下面是一個完整的例子,比較典型地展示了通常使用委派的三個步驟:

using System;

delegate int Compute(int left, int right);

//委派類型聲明

class A

{

public int Mul(int num1, int num2)

{ return num1*num2;

}

}

class Test

{

public static int Add(int num1, int num2)

{ return num1+num2;

}

static void Main()

{ Compute c1=new Compute(Add);

//靜態方法的實例化

A a=new A();

Compute c2=new Compute(a.Mul);

//實例方法的實例化

int r1=c1(2,3);//委派調用

int r2=c2(2,3);//委派調用

Console.WriteLine(r1);

Console.WriteLine(r2);

}

}

委派組合

委派組合是指一個委派類型可以同時綁定多個可調用的方法。由於綁定多個方法,C#規定組合委派的返回類型必須為void。當然,這些方法的參數類型也必須都和組合委派的參數類型兼容。委派組合采用“+”或“+=”來將兩個委派類型合並為一個新的組合委派類型; 采用“-”或“-=”來從組合委派類型上移除已經綁定一個方法的委派實例或綁定多個方法的組合委派實例。

需要注意的是在做委派的組合和移除操作的時候,參與操作的委派類型必須相同——注意是“相同”不是“相等”。看下面的例子:

using System;

delegate void MyDelegate(string s);

class Test

{

public static void Hello(string s)

{

Console.WriteLine(“Hello, {0}!”, s);

}

public static void Goodbye(string s)

{

Console.WriteLine(“Goodbye, {0}!”, s);

}

public static void Main()

{

MyDelegate a, b, c, d;

a = new MyDelegate(Hello);

b =new MyDelegate(Goodbye);

c = a + b;//委派的組合

d = c - a;//委派的移除

a(“A”);

b(“B”);

c(“C”);

d(“D”);

}

}

程序輸出:

Hello, A!

Goodbye, B!

Hello, C!

Goodbye, C!

Goodbye, D!

可以看到在委派組合後,組合委派類型C同時綁定了兩個方法Hello(string s)和Goodbye(string s),從它的輸出可以看到這一點。

需要注意的是組合委派中的方法調用是有順序的,如果在上面的例子中修改“c = a + b; ”為“c=b + a; ”,將看到輸出序列的改變。

同樣委派的移除也是有順序的,它總是從綁定的委派實例中的最後開始搜索需要移出的委派實例——注意這裡的移除是以委派實例為單位的,而不是以方法為單位。可以將上面的例子進行修改,再看看結果:

public static void Main()

{

MyDelegate a, b, c, d;

a = new MyDelegate(Hello);

b =new MyDelegate(Goodbye);

c = a+b+a;//委派的組合

b+=b;//委派的組合

d = c - b;//委派的移除

a(“A”);

b(“B”);

c(“C”);

d(“D”);

}
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved