c#:拥有 接口和委托(函数指针)关键字, 那么回调对 c#来说,就是非常容易实现的了。
c#,用 委托来实现回调 。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace helloworld { //web server public abstract class Callback { public static void PresentCallBack() { //假装这个类是一个服务器 //有用户访问了首页. 那么就建立一个首页出来. Page index = new Page(); //用户点击了按钮. index.btn_add.OnClick(); //用户点击了按钮. index.btn_otherbtn.OnClick(); } } //button. public delegate void OnClickHandle(Button sender); public class Button { public string myID; public OnClickHandle btn_OnClick; public Button(string _tag, OnClickHandle _click) { btn_OnClick = _click; myID = _tag; } //1. 按钮把点击得实际动作,通过一个委托(本质就是函数指针),延迟定义在page 类中.注意这里的延迟,并不是运行或编译时延迟,而是 编写代码时延迟. public void OnClick() { if(btn_OnClick!=null) { btn_OnClick(this); } } } //page public class Page { public Button btn_add; public Button btn_otherbtn; public Page() { btn_add = new Button("add", new OnClickHandle(OnClick_add)); btn_otherbtn = new Button("add", new OnClickHandle(OnClick_other)); } //2 .按钮的实际动作,并不由按钮类来制定,而是由添加按钮的页面本身来制定. public void OnClick_add(Button sender) { Console.WriteLine("click add button"); } public void OnClick_other(Button sender) { Console.WriteLine("click other btn"); } } }
使用了 匿名函数 和 系统 预置的 泛型委托 变量 Action<T> func<in,xx,xx,out>
本质和上面例子没有发生一丝变化。加了语法糖而已。原因:1. 实现委托的函数基本都是给某个委托专用。可以发明一个匿名函数出来。2. 委托原型大多会重复,那么v.net 框架 就先预置了16个泛型委托定义。疯狂的。。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace helloworld { //写程序过程中,会发现,同一个项目.经常会定义各种委托,有很多,参数其实是一样的.如果 先定义好几个常用的参数类型的委托.那么就方便很多了. //而当出现泛型后, .net 果真在系统库中,定义了16个范型委托,16个不同就是参数个数不同.从1参到16参数 , 类型全部范西.有点疯狂. //Action<int> myhandle 就相当于 ==> delegate void Action(int); Action myhandle; 意思就是系统已经预订了一个delegate. delegate void Action(int); //func<int,bool> myhandle 相当于 delegate bool func (int); func myhandle;意思就是系统已经预订了一个delegate //web server public abstract class Callback { public static void PresentCallBack() { //假装这个类是一个服务器 //有用户访问了首页. 那么就建立一个首页出来. Page index = new Page(); //用户点击了按钮. index.btn_add.OnClick(); //用户点击了按钮. index.btn_otherbtn.OnClick(); } } public class Button { public string myID; public Action<Button> btn_OnClick;//不用再先定义一个委托了,直接用系统的action的范型委托. public Button(string _tag, Action<Button> _click) { btn_OnClick = _click; myID = _tag; } //1. 按钮把点击得实际动作,通过一个委托(本质就是函数指针),延迟定义在page 类中.注意这里的延迟,并不是运行或编译时延迟,而是 编写代码时延迟. public void OnClick() { if(btn_OnClick!=null) { btn_OnClick(this); } } } //page public class Page { public Button btn_add; public Button btn_otherbtn; public Page() { //匿名函数 btn_add = new Button("add", new Action<Button>(delegate(Button btn) { Console.WriteLine("test var function"); })); btn_otherbtn = new Button("otherbtn", delegate(Button btn) { Console.WriteLine("test var function :other btn"); } ); } } }
lambda是在.net 里,最终还是编译为匿名函数 一样 的 东西。看看lambda如何书写。
//page public class Page { public Button btn_add; public Button btn_otherbtn; public Page() { //匿名函数 btn_add = new Button("add", delegate(Button btn) { Console.WriteLine("test var function"+btn.myID);}); //lambda表达式,书上只是给出了书写格式例子:(参数列表) => {} 。如果他和匿名函数是一样。只是简化几个代码?那就没有什么必要。 baidu λ演算,不是浅显易懂的含义。鲜不管吧。记住格式先。 btn_otherbtn = new Button("otherbtn", (Button btn) => { Console.WriteLine("test var function"+btn.myID);}); } }