C# 委托及各种写法
2016-04-25 14:54
453 查看
委托是神马?
委托是一个类型安全的对象,它指向程序中另一个以后会被调用的方法(或多个方法)。通俗的说,委托是一个可以引用方法的对象,当创建一个委托,也就创建一个引用方法的对象,进而就可以调用那个方法,即委托可以调用它所指的方法。
如何使用委托?
1、定义委托类型
[访问修饰符]delegate 返回类型 委托名(形参);
2、声明委托对象
委托名 委托实例名;
3、创建委托对象(确定与哪些方法进行绑定)
委托实例名=new 委托名(某个类的方法)
4、使用委托调用方法
委托实例名(实参)
委托注意事项:
1、委托和方法必须具有相同的参数。
2、委托可以调用多个方法,即一个委托对象可以维护一个可调用方法的列表而不是单独的一个方法,称为多路广播(多播)。
3、使用+=和-=运算实现方法的增加和减少
示例
写法:
1、委托 委托名=new 委托(会调用的方法名); 委托名(参数);
2、委托 委托名 =会调用的方法名; 委托名(参数);
3、匿名方法
委托 委托名=delegate(参数){会调用的方法体};委托名(参数);
4、拉姆达表达式
委托 委托名=((参数1,。。参数n)=>{会调用的方法体});委托名(参数);
5、用Action<T>和Func<T>,第一个无返回值
Func<参数1, 参数2, 返回值> 委托名= ((参数1,参数2) => {带返回值的方法体 });返回值=委托名(参数1,参数2);
贴代码:
委托是一个类型安全的对象,它指向程序中另一个以后会被调用的方法(或多个方法)。通俗的说,委托是一个可以引用方法的对象,当创建一个委托,也就创建一个引用方法的对象,进而就可以调用那个方法,即委托可以调用它所指的方法。
如何使用委托?
1、定义委托类型
[访问修饰符]delegate 返回类型 委托名(形参);
2、声明委托对象
委托名 委托实例名;
3、创建委托对象(确定与哪些方法进行绑定)
委托实例名=new 委托名(某个类的方法)
4、使用委托调用方法
委托实例名(实参)
委托注意事项:
1、委托和方法必须具有相同的参数。
2、委托可以调用多个方法,即一个委托对象可以维护一个可调用方法的列表而不是单独的一个方法,称为多路广播(多播)。
3、使用+=和-=运算实现方法的增加和减少
示例
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Delegate; namespace Delegate { public delegate int Call(int num1, int num2);//第一步:定义委托类型 class SimpleMath { // 乘法方法 public int Multiply(int num1, int num2) { return num1 * num2; } // 除法方法 public int Divide(int num1, int num2) { return num1 / num2; } } } class Test { static void Main(string[] args) { Call objCall;//第二步:声明委托对象 // Math 类的对象 SimpleMath objMath = new SimpleMath(); // 第三步:创建委托对象,将方法与委托关联起来 objCall = new Call(objMath.Multiply); Call objCall1 = new Call(objMath.Divide); objCall += objCall1;//向委托增加一个方法 //objCall -= objCall1;//向委托减去一个方法
// 调用委托实例,先执行objMath.Multiply,然后执行objMath.Divide int result = objCall(5, 3); System.Console.WriteLine("结果为 {0}", result); Console.ReadKey(); } }
写法:
1、委托 委托名=new 委托(会调用的方法名); 委托名(参数);
2、委托 委托名 =会调用的方法名; 委托名(参数);
3、匿名方法
委托 委托名=delegate(参数){会调用的方法体};委托名(参数);
4、拉姆达表达式
委托 委托名=((参数1,。。参数n)=>{会调用的方法体});委托名(参数);
5、用Action<T>和Func<T>,第一个无返回值
Func<参数1, 参数2, 返回值> 委托名= ((参数1,参数2) => {带返回值的方法体 });返回值=委托名(参数1,参数2);
贴代码:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using @delegate; namespace @delegate { public delegate int Call(int num1, int num2); class SimpleMath { // 乘法方法 public static int Multiply(int num1, int num2) { return num1 * num2; } // 除法方法 public int Divide(int num1, int num2) { return num1 / num2; } } class Test { static void Main(string[] args) { //--------------------第一种写法------------------------// //Call objCall = new Call(SimpleMath.Multiply); //Call objCall1 = new Call(new SimpleMath().Divide); //--------------------第二种写法------------------------// //Call objCall = SimpleMath.Multiply; //Call objCall1 = new SimpleMath().Divide; //--------------------第三种写法------------------------// //Call objCall = delegate(int a, int b) //{ // return a * b; //}; //Call objCall1 = delegate(int a, int b) //{ // return a / b; //}; //--------------------第四种写法------------------------// //Call objCall =((int a,int b)=> { return a*b;}); //Call objCall1 = ((int a, int b) => { return a / b; }); //--------------------第五种写法------------------------// Func<int, int, int> objCall = ((a, b) => { return a * b; }); Func<int, int, int> objCall1 = ((a, b) => { return a / b; }); Action<int, int> ob = ((a, b) => { Console.WriteLine(a * b); }); ob(5, 3); //----------------------------------------------------// int result = objCall(5, 3); int result1 = objCall1(5, 3); System.Console.WriteLine("结果1为 {0},结果2为{1}", result,result1); Console.ReadKey(); } } }
相关文章推荐
- C# WPF中DataGrid的数据绑定(Binding)
- C#利用zxing.net操作二维码和条形码
- C# WinForm开发系列 - ZedGraph
- 几种排序算法的c#实现
- C#获取汉字的拼音首字母帮助类库
- C#.Net过滤特殊字符通用类库方法
- 0基础学C#教程3--------winform中的vs工具箱不见了,怎么重新调出来?
- 【C#】开发可以可视化操作的windows服务
- C# 使用xenocode混淆加密【转】
- 【C#设计模式-原型模式】
- C# dataGridView表格,可以鼠标拖动替换单元格行
- 【C#-深度复制和浅度复制的比较】
- C#学习——简单socket、多线程
- C#日期时间格式化
- Webdriver(selenium2.0)+NUnit+C# (一)
- C#新手学习快速成长学习资源汇总
- C#下批量判断该条记录在表中是否存在问题
- VS快捷键
- C#中params关键字的作用理解
- 在C#里面给PPT添加注释