浅析C#中的回调函数
2010-08-30 11:42
225 查看
自己整理了一个简单的例子来说明回调函数的用法:
namespace CallBackFunction
{
class
Program
{
static void Main(string[] args)
{
Program prog = new
Program();//在静态函数Main中调用非静态方法时,必须先实例化该类对象,方可调用GetSum方法
SumClass
sc = new SumClass();//实例化SumClass类
int
result=sc.SumAll(prog.GetSum);
Console.WriteLine(result.ToString());
}
private int GetSum(int a, int b)
{
return (a + b);
}
}
class
SumClass
{
public delegate int Sum(int num1, int num2);
public int SumAll(Sum sum)
{
//可以进行些别的操作
return sum(1, 2);//调用传入函数的一个引用
}
//可以封装更多的业务逻辑方法
}
}
这个例子非常的简单,假设SumClass类是一个被封装好的,实现某种业务逻辑的类.
其中包含一个委托(delegate)Sum返回值为int型,有两个int型的参数.
还包括一个返回值为int方法SumAll,注意这个方法的参数,是Sum类型的参数,也可以理解为是一个函数的引用(这个函数就是回调函数).作为参数的sum,可以说是某个函数的引用,这个函数返回值为int,并提供两个整型参数.现在大概可以理解了吧?所谓委托可以被看作是一组方法签名相同的函数的引用的"类",其每一个实例都是符合该方法签名的函数的一个引用.在该方法中可以进行一些操作,并调用传进来的函数引用(sum),而此时sum这个方法内的具体业务逻辑是怎样的并不清楚,SumClass就充当了一个接口的作用,这时接口就需要调用SumClass类的客户端来通过定义一个"回调函数"来实现其具体功能了.
再看Program类,这个类其实就是调用SumClass这个类的一个"客户端".
先来看GetSum这个方法,返回值为int,接受两个int型的参数...如果前面说的你都明白了,那么你一定很清楚GetSum就是作为客户端的"回调函数"用来作为参数的.这个函数实现了两个参数是相加并返回其和的业务逻辑.
在Main函数中,调用SubClass类的SubAll方法,将Programe类的GetSum方法的引用作为参数传递到SubAll方法中,也就是在SubAll中调用GetSum这个相加两个参数的方法,将1和2相加返回3,并将result(3)输出到屏幕上.
通常情况下SubClass类会被封装到DLL中,而参数类型即为一个委托,传入此委托的一个实例(回调函数)来帮助SubClass实现其业务逻辑.
最后再举一个生活中的例子帮助大家来理解:
一天你老婆让你去市场买菜,而你因为偷懒就让你的儿子去买,把菜买回来了你直接将菜交给老婆.而老婆只是想要菜,并不关心菜是谁买的.第二天你老婆让你去买米,结果你又交由儿子处理.第三天老婆让去买肉,可怜的儿子再次被你叫去了...
从这些事情我们可以抽象出一个类来.
这个类就是实现不管老婆让你去做什么,你都叫儿子去代劳.那么我们就可以定义一个"让儿子去做"这样的委托.然后传入"买菜","买肉"等函数进来,这些函数就是回调函数.这样不论老婆需要"买菜","买肉"或者其他任何的事情,都可以通过你这个类来完成.
namespace CallBackFunction
{
class
Program
{
static void Main(string[] args)
{
Program prog = new
Program();//在静态函数Main中调用非静态方法时,必须先实例化该类对象,方可调用GetSum方法
SumClass
sc = new SumClass();//实例化SumClass类
int
result=sc.SumAll(prog.GetSum);
Console.WriteLine(result.ToString());
}
private int GetSum(int a, int b)
{
return (a + b);
}
}
class
SumClass
{
public delegate int Sum(int num1, int num2);
public int SumAll(Sum sum)
{
//可以进行些别的操作
return sum(1, 2);//调用传入函数的一个引用
}
//可以封装更多的业务逻辑方法
}
}
这个例子非常的简单,假设SumClass类是一个被封装好的,实现某种业务逻辑的类.
其中包含一个委托(delegate)Sum返回值为int型,有两个int型的参数.
还包括一个返回值为int方法SumAll,注意这个方法的参数,是Sum类型的参数,也可以理解为是一个函数的引用(这个函数就是回调函数).作为参数的sum,可以说是某个函数的引用,这个函数返回值为int,并提供两个整型参数.现在大概可以理解了吧?所谓委托可以被看作是一组方法签名相同的函数的引用的"类",其每一个实例都是符合该方法签名的函数的一个引用.在该方法中可以进行一些操作,并调用传进来的函数引用(sum),而此时sum这个方法内的具体业务逻辑是怎样的并不清楚,SumClass就充当了一个接口的作用,这时接口就需要调用SumClass类的客户端来通过定义一个"回调函数"来实现其具体功能了.
再看Program类,这个类其实就是调用SumClass这个类的一个"客户端".
先来看GetSum这个方法,返回值为int,接受两个int型的参数...如果前面说的你都明白了,那么你一定很清楚GetSum就是作为客户端的"回调函数"用来作为参数的.这个函数实现了两个参数是相加并返回其和的业务逻辑.
在Main函数中,调用SubClass类的SubAll方法,将Programe类的GetSum方法的引用作为参数传递到SubAll方法中,也就是在SubAll中调用GetSum这个相加两个参数的方法,将1和2相加返回3,并将result(3)输出到屏幕上.
通常情况下SubClass类会被封装到DLL中,而参数类型即为一个委托,传入此委托的一个实例(回调函数)来帮助SubClass实现其业务逻辑.
最后再举一个生活中的例子帮助大家来理解:
一天你老婆让你去市场买菜,而你因为偷懒就让你的儿子去买,把菜买回来了你直接将菜交给老婆.而老婆只是想要菜,并不关心菜是谁买的.第二天你老婆让你去买米,结果你又交由儿子处理.第三天老婆让去买肉,可怜的儿子再次被你叫去了...
从这些事情我们可以抽象出一个类来.
这个类就是实现不管老婆让你去做什么,你都叫儿子去代劳.那么我们就可以定义一个"让儿子去做"这样的委托.然后传入"买菜","买肉"等函数进来,这些函数就是回调函数.这样不论老婆需要"买菜","买肉"或者其他任何的事情,都可以通过你这个类来完成.
相关文章推荐
- C#服务端端口侦听浅析
- 浅析C#中图形编程
- 详解C#中委托、事件和回调函数(转)
- C#反射命名空间浅析
- 浅析C# 中object sender与EventArgs e
- 【C#】C#反射浅析
- (ZZ)浅析 c# Queue
- 浅析C#深拷贝与浅拷贝
- C#值类型、引用类型中的Equals和==的区别浅析
- C# abstract修饰符浅析
- C#正则表达式之组与非捕获组浅析 2009-08-20 13:44 chenglidexiaoxue CSDN博客 字号:T | T 一键收藏,随时查看,分享好友! C#正则表达式之组与非捕获组是什么
- 浅析C#中三层架构的实现
- c# 把一个匿名对象赋值给一个Object类型的变量后,怎么取这个变量? c# dynamic动态类型和匿名类 详解C# 匿名对象(匿名类型)、var、动态类型 dynamic 深入浅析C#中的var和dynamic
- C#线程优先级浅析
- 浅析C# new 和Override的区别
- 浅析 回调函数
- C#网络编程服务器端程序实现源码浅析
- C#调用C++DLL中的回调函数(异步的情况,DLL中会在事件触发时调用函数)
- C#强化系列文章六:应用程序域(AppDomain)浅析
- 浅析编写C#多线程