一、什么是委托?
委托类型声明的格式如下:
public delegate void TestDelegate(string message);
1.delegate 关键字用于声明一个引用类型,该引用类型可用于封装命名方法或匿名方法。委托是类型安全和可靠的。
2.委托是一种引用方法的类型。一旦为委托分配了方法,委托将与该方法具有完全相同的行为。委托方法的使用可以像其他任何方法一样,具有参数和返回值,如下面的示例所示:
3.委托具有以下特点:
-
委托类似于 C++ 函数指针,但它是类型安全的。
-
委托允许将方法作为参数进行传递。
-
委托可用于定义回调方法。
-
委托可以链接在一起;例如,可以对一个事件调用多个方法。
-
方法不需要与委托签名精确匹配。有关更多信息,请参见协变和逆变。
-
C# 2.0 版引入了匿名方法的概念,此类方法允许将代码块作为参数传递,以代替单独定义的方法。
二、委托在.net中的几种写法
1.在.net 1.0中的写法如下:
public delegate void TestDelegate(string message);
//委托的匹配方法
public static void TestMethod(string msg)
{
Console.WriteLine(string.Format(".net 委托:{0}", msg));
}
static void Main(string[] args)
{
#region .net 1.x写法
TestDelegate dele1 = TestMethod;
dele1(".net 1.x写法");
TestDelegate dele2 = new TestDelegate(TestMethod);
dele2(".net 1.x写法");
#endregion
}
2.在.net 2.0中的写法,.net 2.0中重要的是引入了匿名方法, 当然也可以使用.net1.0中的写法。
static void Main(string[] args)
{
//申明委托对象的时候直接指向一个方法(匿名)的实现
TestDelegate dele3 = delegate(string msg)
{
Console.WriteLine(string.Format(".Net委托:{0}", msg));
};
dele3(".net2.x写法--匿名方法");
}
3.在.net 3.x中的写法,引入Lambda 表达式,我们来看微软给Lambda 表达式的定义:
“Lambda 表达式”是一个匿名函数,它可以包含表达式和语句,并且可用于创建委托或表达式树类型。
所有 Lambda 表达式都使用 Lambda 运算符 =>,该运算符读为“goes to”。该 Lambda 运算符的左边是输入参数(如果有),右边包含表达式或语句块。Lambda 表达式 x => x * x 读作“x goes to x times x”。
TestDelegate dele4 = msg => Console.WriteLine(string.Format(".Net委托:{0}", msg));
dele4(".net 3.x写法中可以引入Lambda 表达式");
只调用单个方法时.
当一个类需要方法说明的多重执行时.
期望使用静态方法执行规范时.
期望得到一个类似事件的模式时.
调用者无需知道无需获取定义方法的对象时
只想给少数既定组件分发执行规范时.
想要简单的组成结构时.