一、是什么
1)委托包含对方法而不是方法名称的引用。使用委托可以在运行时动态设定要调用的方法,不知道方法名称,也可以调用方法,执行(或调用)一个委托将执行该委托引用的方法。
2)委托将名称与方法的定义连接起来,即将方法的实现附加到该名称。这样便可以使用该名称调用特定的方法。但是,委托要求方法的实现和委托必须具有相同的方法签名(也就是说,他们应该具有相同数量/类型的参数),并有相同类型的返回值。
3)委托更像一个具有通用的方法名称,在不同的情况将该名称指向不同的方法,并通过委托执行这些方法。
二、怎么用
使用委托包括三个步骤:
1)定义委托
2)实例化委托
3)使用委托
我们上一个例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
class
Program
{
//定义一个委托
public
delegate
int
Call(
int
num1,
int
num2);
class
Math
{
public
int
Mutiply(
int
num1,
int
num2)
{
return
num1 * num2;
}
public
int
Divide(
int
num1,
int
num2)
{
return
num1 / num2;
}
}
static
void
Main(
string
[] args)
{
Call objCall;
Math objMath =
new
Math();
objCall =
new
Call(objMath.Mutiply);
//实例化一个委托
int
result = objCall(5, 3);
//使用委托
Console.WriteLine(
"结果为 {0}"
, result);
}
}
|
上面的例子,我们再进一步,用匿名委托实现:
1
2
3
4
5
6
|
static
void
Main(
string
[] args)
{
Call objCall =
delegate
(
int
num1,
int
num2) {
return
num1 * num2; };
//匿名委托
int
result = objCall.Invoke(3, 5);
//使用委托
Console.WriteLine(
"结果为 {0}"
, result);
//输出:结果为 15
}
|
我们还可以将:
1
|
int
result = objCall.Invoke(3, 5);
//使用委托
|
替换为:
1
|
int
result = objCall(3, 5);
//使用委托
|
效果是一样的。
再进一步,用Lambda表达式进行简化,可以将:
1
|
Call objCall =
delegate
(
int
num1,
int
num2) {
return
num1 * num2; };
//匿名委托
|
替换为:
1
|
Call objCall = (
int
num1,
int
num2) => {
return
num1 * num2; };
//Lambda表达式
|
更简化一步,变为:
1
|
Call objCall = (num1, num2) => {
return
num1 * num2; };
//Lambda表达式
|
这就是C#委托的进化过程以及C#Lambda表达式对委托的支持。
三、什么时候用
1)委托类似于C语言中的函数指针,可以将方法作为函数的参数进行传递
2)当不知道方法的具体实现时,就可以定义个委托,让它替我们干活
3)我们在编程时用的最多的就是事件注册时使用。
比如:
1
|
this
.button1.Click +=
new
EventHandler(button1_Click);
//button1注册Click事件
|
1
2
3
4
|
private
void
button1_Click(
object
sender, EventArgs e)
{
//方法具体实现内容
}
|
可以看到方法button1_Click作为参数传递给了EventHandler委托。
再比如在线程方法中:
1
2
3
|
Thread th =
new
Thread(
new
ThreadStart(Method));
//这里的ThreadStart就是一个委托,里面可以直接传一个方法名Method,以委托的形式调用方法
th.IsBackground =
true
;
th.Start();
|
四、生活中的例子
其实委托的概念还是比较容易理解的。我们在实际生活中例子很多,比如我要去参加某个不太重要的会议(签署什么文件),但是由于很忙我没有时间去参加。这时候我委托一个同事让他代替我去参加这个会议并代表我签署文件。至于会议的什么细节我不用考虑,我只要知道他能够替我完成这个任务就行。这个同事就是一个委托的对象,我只要定义好委托的要求(方法名、参数等),然后让他去而不是别人就行了(如果让别人去就是去干别的活了)。
本文转自 guwei4037 51CTO博客,原文链接:http://blog.51cto.com/csharper/1344196