几种常见语言的基本语法对比:事件 ,回调-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);});
        }
    }
原文地址:https://www.cnblogs.com/lsfv/p/9600040.html