委托
1. 什么是委托
委托是一种引用方法的类型,
一旦为委托分配了方法,委托将与该方法具有完全相同的行为。委托方法的使用可以像其他任何方法一样,具有参数和返回值
,
其实委托类似与
C++
中的函数指针
,
但委托是类型安全和可靠的
,
委托是事件的基础
2. 委托概诉
l
委托类似于
C++
函数指针,但它是类型安全的
l
委托允许将方法作为参数进行传递
l
委托可以用于定义回调方法
l
委托可以链接在一起
;(
如
:
对一个事件调用多个方法
)
l
方法不需要与委托签名精确匹配。
l
C#2.0
中引入了匿名方法的概念
,
该方法允许将代码作为参数传递
,
以代替单独定义的方法
(
下面我们会讲到的
)
3.
何时使用委托而不使用接口
以下情况中使用委托
:
l 在设计事件的时
l 封装静态方法时
l
当调用方不需要访问实现该方法的对象中的其他属性、方法或接口时
l
当类可能需要该方法的多个实现时
在以下情况中使用接口:
l
当存在一组可能被调用的相关方法时
l
当类只需要方法的单个实现时
l
当使用接口的类想要将该接口强制转换为其他接口或类类型时
l
当正在实现的方法链接到类的类型或标识时:例如比较方法
4. 委托的关联方式
1) 与命名方法关联
委托可以与命名方法关联。使用命名的方法对委托进行实例化时,该方法将作为参数传递这就是使用命名的方法
,
一般用于对静态方法货实例方法进行封装
(2.0
之前的版本中使用命名的方法是对委托进行实例化的唯一方式
)
2) 与匿名方法关联
匿名方法将代码块传递为委托参数,使用匿名方法就不必创建单独的方法,因此减少实例化委托所需要的编码系统开销
注意:
u 匿名方法的参数的范围是 匿名方法块
u
在目标在块外部的匿名方法块内使用跳转语句(如
goto
、
break
或
continue
)是错误的。
u
目标在块内部的匿名方法块外部使用跳转语句(如
goto
、
break
或
continue
)也是错误的
u
如果局部变量和参数的范围包含匿名方法声明,则该局部变量和参数称为该匿名方法的外部变量或捕获变量
5. Dome
using
System;
using
System.Collections.Generic;
using
System.Text;
namespace
DelegaterDome
{
delegate void Add(int x,int y);// //
定义一个委托方法
class Program
{
static void Main(string[] args)
{
#region
匿名方法
System.Threading.Thread t1 = new System.Threading.Thread(delegate()
{
System.Console.WriteLine("aaa");
//System.Threading.Thread.Sleep(2000);
System.Console.WriteLine("bbb");
});
t1.Start();
int t2 = 10;
int t3 = 20;
Add add = delegate(int x, int y)
{
Console.WriteLine("
总和为:{0}"
,x+y);
};
add(t2, t3);
#endregion
#region
命名方法
add = new Add(Program.Sum);
add(t2, t3);
#endregion
Console.ReadLine();
}
static void Sum(int x, int y)
{
Console.WriteLine("
总和为:{0}"
, x + y);
}
}
}
6.