定义一个委托:
public delegate void Del( string message);
构造委托对象时,通常提供委托将包装的方法的名称或使用匿名方法。实例化委托后,委托将把对它进行的方法调用传递给方法。调用方传递给委托的参数被传递给方法,来自方法的返回值(如果有)由委托返回给调用方。这被称为调用委托。可以将一个实例化的委托视为被包装的方法本身来调用该委托。
例如:// Create a method for a delegate.
public static void DelegateMethod(string message)
{
System.Console.WriteLine(message);
}
// Instantiate the delegate.
Del handler = DelegateMethod;
// Call the delegate.
handler("Hello World");
委托(Delegate):
是.NET Framework对C#和VB.NET等面向对象编程语言特性的一个重要扩充。委托是.NET中的一些重要技术,比如事件、异步调用和多线程开发的技术基础。
委托在.NET开发中应用极广,每一名.NET软件工程师都必须了解委托。
1.委托可以看成是一个方法的“容器”,将某一具体的方法“装入”后,就可以把它当成方法一样调用。
2.一个委托类型的变量,可以引用任何一个满足其要求的方法。从这点意义上看,委托类似于C语言中的“函数指针”。
由于委托变量可以引用一个方法调用列表,并且具有可以被随时改变所引用的方法调用列表的特性,这就使委托在开发中大有用处,可以解决许多实际问题。
1.定义委托类型
2.定义一个或多个符合委托类型的方法
3.定义委托类型的变量
4.将第2步定义的方法引用“挂接”到第3步定义的变量,以形成一个“方法调用列表”。
5.通过委托变量“间接”调用方法调用列表。
定义委托:
public delegate int AddDelegate(int i,int j );
使用匿名方法定义委托变量
AddDelegate del = delegate(int i, int j){return i+ j;};
Console.WriteLine(del(100,200));
匿名方法其实是将方法定义与委托变量赋值两个步骤合在一起。
委托类型可作为方法形参
public static void invokeDelegate(AddDelegate del, int i, int j)
{Console.WriteLine( del(i, j) );}
匿名方法可直接作为方法的实参
invokeDelegate(delegate(int i, int j){return i+ j;}, 100, 200);
多路广播委托:http://msdn.microsoft.com/zh-cn/library/ms173175.aspx
//定义泛型委托
//定义泛型委托
public delegate T MyGenericDelegate<T>(T obj);
class Program
{
static void Main(string[] args)
{
//使用匿名方法给泛型委托变量赋值
MyGenericDelegate<int> del = delegate(int vlaue)
{
return vlaue * 2;
};
MyGenericDelegate<string> add = delegate(string content)
{
return content;
};
//调用泛型委托变量引用的匿名方法
Console.WriteLine(del(100));
Console.WriteLine(add("Hello World!"));
Console.ReadKey();
}
}
匿名方法小结在.NET 2.0时代,匿名方法主要是作为简化代码的手段而引入到C# 2.0语法特性中的。
然而,也许设计者事先也并没有预想到,这一原先仅出现在特定编程语言中的特性,却成为了.NET 3.5中的重要技术——LINQ的基础之一。
委托是一种方法引用类型。一旦为委托分配了方法,委托将与方法具有相同的行为。
委托方法的使用和其他方法一样,同样具有返回值和参数。与委托的签名(由返回类型和参数组成)匹配的任何方法都可以分配给该委托。
这样就可以通过编程方式改变方法的调用,还可以向现有类中插入新代码。只要知道委托的签名,便可以分配自己的委托方法。
再次提醒:委托是一项重要的编程技能,所有的.NET开发者都必须掌握它。否则,将在开发.NET应用程序的过程中遇到很多困难。
MSDN中介绍委托:http://msdn.microsoft.com/zh-cn/library/ms173171.aspx
文中部分内容转自: 金旭亮面向对象编程系列