• 几种常见语言的基本语法对比:事件 ,回调-c#


    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);});
            }
        }
  • 相关阅读:
    修复mac os中的home键和end键
    利用numpy实现list降维
    string与StringBuilder的区别
    mysql 版本,mysqlconnectorjava, application.xml 的 driverclassname 的依赖关系
    linux下创建新用户新数据库并远程访问
    谷歌的JS编码规范链接
    sed命令之多行拷贝
    box2dWeb引擎案例
    SQL Server数据库镜像笔记
    团队项目系统设计
  • 原文地址:https://www.cnblogs.com/lsfv/p/9600040.html
Copyright © 2020-2023  润新知