委托是一种类型,它封装了一类要领,这些要领具有不异的要领签名(signature)和返回类型。界说听起来有点拗口,首先可以确定委托是一种数据类型,那么什么是要领签名,其实就是指要领的输入参数列表。来看下面的例子,类deleMthod界说了3个要领,add、minus和multi,他们都具有不异的输入参数列表(int x,int y)和输出参数类型int,那么我们就说这三个要领具有不异的要领签名和返回类型。开发者可以抽象地用 int 某名称(int x,int y) 的一种类型对要领进行封装,在c#中这种抽象的数据类型叫委托,针对上述的几个要领我们可以界说委托 : public delegate int Handler(int x ,int y),public 是一个访谒修饰符,delegate关键字暗示这是一个委托,int Hander(int x,int y)暗示这个委托的名称。
class deleMethod { public int add(int x, int y) { return x + y; } public int minus(int x, int y) { return x - y; } public int multi(int x, int y) { return x * y; } } 怎么使用委托
使用委托梗概有四个法式:
界说一个委托类型,上节已经提及。
界说委托要领,上节deleMethod类中add、minus、multi都是委托要领,界说的目的就是为了使用它,讲专业点就是为了要领的挪用
委托变量及赋值,和类型一样,在使用前需要对变量赋值。
委托变量的使用。
怎样界说委托变量,还是接着上面的例子。我们已经界说了一个委托类型 public delegate int Handler(int x,int y),和c#语规则范一样界说一个变量并赋值语法是:“类型名 变量名 = new 类型名(要领);”,如上例
“Handler deleCall = new Handler(要领名);“,在.net2.0后对付委托的实例化可以简化为” Handler deleCall = 要领名;“。
委托变量的使用,也就是对委托要领的挪用。其语法是”int result1 = deleCall(10,20);“或者使用委托挪用要领 Invoke,“int result2 = deleCall.Invoke(10,20);”。
具体如何使用可以看看下面的示例:
class Program { public delegate int Handler(int x, int y); //---界说委托的类型,可以将委托当作一种特殊的数据类型 static void Main(string[] args) { deleMethod dm = new deleMethod(); //---实例化包罗委托要领的类型 Handler deleCall = new Handler(dm.add); //---界说委托变量delCall,并出示化赋值 int result1 = deleCall(10, 20); //---实例要领的挪用invoke Console.WriteLine("the add resutl is:{0}", result1); deleCall = dm.minus; int result2 = deleCall.Invoke(12, 6); Console.WriteLine("the minus result is:{0}", result2); Console.ReadLine(); } }
如上例所示,界说一个简单的加、减成果如此的庞大,搅来搅去让人头,真是无语,难怪很多伴侣谈委托色变晕。在实际使用的过程中,c#还是有很多方法帮我们简化代码。
简化委托 预界说的泛型委托c#系统最常见的预界说的委托类型有三种,Func<>委托、Action<>委托、Predicate<>委托,Func<>委托是一个有返回值的委托,输入参数可以多达16个;而Action<>委托是一个没有返回值的委托,它的输入参数也可以多达16个;而Predicate<>是一个具有bool返回类型的委托,它只运行一个输入参数。对付有上例的委托类型,我们可以使用预界说的委托类型Fun<int,int,int>来取代,省去我们本身界说一个什么鬼对象 public delegate int Handler(int x,int y)类型,其代码其实可以简化为如下例所示:
namespace DelegateDemo1 { class Program { static void Main(string[] args) { deleMethod dm = new deleMethod(); Func<int, int, int> fun = dm.add; //---使用预界说的委托类型Func<> int result4 = fun(8, 10); Func<int, int, int> fun1 = dm.minus; int result5 = fun1(12, 8); Console.WriteLine("预界说的委托输出{0},{1}", result4, result5); Console.ReadLine(); } } class deleMethod { public int add(int x, int y) { return x + y; } public int minus(int x, int y) { return x - y; } public int multi(int x, int y) { return x * y; } } }