C#基础-3:委托(Delegate)
2016-07-20 09:51
369 查看
委托(delegate)简单来看就是一种指向方法的引用对象。其实,delegate就是一个类,其持有所指向的方法的地址。
委托可以引用一个方法,也可以应用多个方法,当引用多个方法的时候,称之为多路广播(多播)。
委托既可以引用静态方法,也可以应用实例方法。
下面先看委托对静态方法的引用:
上面这两个委托都只引用一个方法。
代码nc(5)实际就是指向静态方法AddNum(5);
代码nc2(10)实际就是指向静态方法MultiNum(10);
执行结果如下:
当我们使用一个委托去引用多个方法时(多播),代码修改如下:
上面Main方法中的代码还可以采用下面这样,实际是一样的:
代码运行结果:
接下来是委托对实例方法的引用:
代码执行结果如下:
对于实例方法的多播跟静态方法没有什么区别,同样是需要对实例方法所属的类进行实例化后传入到委托的参数当中。
委托是将方法的引用封装在委托对象内,然后可以将该委托对象传递给可调用所引用方法的代码,而不必在编译时知道将调用哪个方法。
委托还可以将一些方法集成到一块执行。
以上是我最近一些理解,后面有更深的体会后会进行补充修改。
委托可以引用一个方法,也可以应用多个方法,当引用多个方法的时候,称之为多路广播(多播)。
委托既可以引用静态方法,也可以应用实例方法。
下面先看委托对静态方法的引用:
//定义一个委托,使用关键字delegate,其后面的int是委托引用的方法的返回值; //NumberChanger是委托名,括号内是委托引用的方法的参数类型。 delegate int NumberChanger(int num); class NumChanger { static int num = 10; //静态方法AddNum() public static int AddNum(int n) { num += n; return num; } //静态方法MultiNum() public static int MultiNum(int n) { num *= n; return num; } public static int GetNum() { return num; } public static void Main() { //实例化委托nc,并引用静态方法AddNum() NumberChanger nc = new NumberChanger(AddNum); //实例化委托nc2,并引用静态方法NultiNum() NumberChanger nc2 = new NumberChanger(MultiNum); //执行委托nc引用的方法 nc(5); Console.WriteLine("num is {0}", GetNum()); //执行委托nc2引用的方法 nc2(10); Console.WriteLine("num is {0}", GetNum()); } }
上面这两个委托都只引用一个方法。
代码nc(5)实际就是指向静态方法AddNum(5);
代码nc2(10)实际就是指向静态方法MultiNum(10);
执行结果如下:
当我们使用一个委托去引用多个方法时(多播),代码修改如下:
//定义一个委托,使用关键字delegate,其后面的int是委托引用的方法的返回值; //NumberChanger是委托名,括号内是委托引用的方法的参数类型。 delegate int NumberChanger(int num); class NumChanger { static int num = 10; //静态方法AddNum() public static int AddNum(int n) { Console.WriteLine("执行了AddNum方法!"); num += n; return num; } //静态方法MultiNum() public static int MultiNum(int n) { Console.WriteLine("执行了MultiNum方法!"); num *= n; return num; } public static int GetNum() { return num; } public static void Main() { //实例化委托nc,并引用静态方法AddNum() NumberChanger nc = new NumberChanger(AddNum); nc += MultiNum; //执行委托nc引用的方法 nc(5); Console.WriteLine("num is {0}", GetNum()); } }
上面Main方法中的代码还可以采用下面这样,实际是一样的:
NumberChanger nc; NumberChanger nc1 = new NumberChanger(AddNum); NumberChanger nc2 = new NumberChanger(MultiNum); nc = nc1; nc += nc2; nc(5); Console.WriteLine("num is {0}", GetNum());
代码运行结果:
接下来是委托对实例方法的引用:
//定义一个委托 delegate string NumToString(int num); class NumToStr { //定义实例方法getString() public string getString(int num) { return Convert.ToString("这是字符串:"+num); } //定义实例方法addStr() public string addStr(int num) { return "这是拼接后的字符串"+num+"-后缀-"; } //Main方法 public static void Main(String[] args) { //将实例方法getString()引用到委托n1 NumToString n1 = new NumToString(new NumToStr().getString); Console.WriteLine(n1(55)); //将实例方法addStr()引用到委托n2 NumToString n2 = new NumToString(new NumToStr().addStr); Console.WriteLine(n2(110)); } }
代码执行结果如下:
对于实例方法的多播跟静态方法没有什么区别,同样是需要对实例方法所属的类进行实例化后传入到委托的参数当中。
总结:
简单理解委托就是用来执行方法的一个东西。委托是将方法的引用封装在委托对象内,然后可以将该委托对象传递给可调用所引用方法的代码,而不必在编译时知道将调用哪个方法。
委托还可以将一些方法集成到一块执行。
以上是我最近一些理解,后面有更深的体会后会进行补充修改。
相关文章推荐
- C#使用委托(delegate)实现在两个form之间传递数据的方法
- C#利用delegate实现Javascript的each方法
- Query中click(),bind(),live(),delegate()的区别
- 详解jquery事件delegate()的使用方法
- jQuery中 delegate使用的问题
- 浅谈jquery中delegate()与live()
- 由点击页面其它地方隐藏div所想到的jQuery的delegate
- jQuery中delegate与on的用法与区别示例介绍
- JS delegate与live浅析
- jQuery事件 delegate()使用方法介绍
- .NET笔记之:Delegate内部原理的分析
- jQuery中bind(),live(),delegate(),on()绑定事件方法实例详解
- C#匿名方法与Delegate类型转换错误分析
- jQuery中delegate和on的用法与区别详细解析
- iOS中jQuery 的delegate 事件监听无效解决办法
- iOS页面传值总结
- UITextField常用delegate
- 试说明在C#中Delegate类的使用
- delegate 委托的使用
- C#的Delegate的小心得