美文网首页unity编程技术
委托与事件 匿名函数lambda表达式

委托与事件 匿名函数lambda表达式

作者: Unity开发 | 来源:发表于2016-12-16 21:50 被阅读52次

    委托:其实就是一种命令,A委托B,做事情的就是B

     * 上面是在现实世界里,反过来在程序世界中的

     * 委托实际上就是存储了方法的地址,做事情的任然是B

     * .net,编程规范说明声明委托是以XXXXEventHandler结局

     * 委托的语法格式:

     * public+delegate关键字+方法返回值+委托名

    事件:事件就是类在发生一些事情的时候通知其他类的一种方式

     * 事件一般会牵扯到俩个角色

     * 1.事件发起者(sender/publisher):实际上就是事件的发行者

     * 2.事件订阅者(Receiver):对发起者发的通知感兴趣的话,就可以选择订阅该事件

     * 

     * 事件绝大部分都要和委托连用

     * 

    * 匿名函数 --》不记名函数 C#2.0引进的

     * lambda表达式            C#3.0引进的

     * 

    class B

    {

    public void BuyThings()

    {

    Console.WriteLine ("A委托B去买些生活用品");

    }

    public void BuyThingsTwo()

    {

    Console.WriteLine ("A委托B去买些生活用品 Two");

    }

    }

    class A

    {

    //声明一个委托

    public delegate void BuyEventHandler();

    public static void Main (string[] args)

    {

    第1种委托方法

    //实例化

    BuyEventHandler buyEventHandler=new BuyEventHandler(new B().BuyThings);

    //调用委托

    buyEventHandler ();

    第二种委托方法

    在关联委托中可以使用+=来绑定多个委托,也可以-=取消绑定委托

    但是前提是委托非空

    B b=new B();

    BuyEventHandler buyEventHandler;

    buyEventHandler = b.BuyThingsTwo;

    buyEventHandler += b.BuyThings; 

    buyEventHandler -= b.BuyThings;

    buyEventHandler -= b.BuyThingsTwo;

    调用委托

    buyEventHandler ();

    }

    }

    事件

    //声明一个委托

    public delegate void SenderEventHandler();

    class SendMarryMessageMa

    {

    //声明一个委托

    // public delegate void SenderEventHandler();

    //为委托绑定事件

    public event SenderEventHandler OnPublisher;

    public void Marry(){

    if (OnPublisher != null) {

    Console.WriteLine ("我又结婚了,各位请准时到场,钱准备好.");

    OnPublisher ();

    }

    }

    }

    interface C

    {

    void ReceiverMarryMessage();

    }

    abstract class CC:C

    {

    abstract public void ReceiverMarryMessage();

    }

    class A:CC

    {

    override public void ReceiverMarryMessage(){

    Console.WriteLine ("好的,小蛇,准时到~");

    }

    }

    class B:CC

    {

    override public void ReceiverMarryMessage(){

    Console.WriteLine ("行行行,去");

    }

    }

    class MainClass

    {

    public static void Main (string[] args)

    {

    //1.实例化发这者

    SendMarryMessageMa sm = new SendMarryMessageMa ();

    //2.绑定订阅者

    // sm.OnPublisher += c.ReceiverMarryMessage;

    // sm.OnPublisher += c2.ReceiverMarryMessage;

    sm.OnPublisher += MainClass.ReturnDelegate (new A ());

    sm.OnPublisher += MainClass.ReturnDelegate (new B());

    //3.执行

    sm.Marry();

    }

    public static SenderEventHandler ReturnDelegate(CC c)

    {

    return c.ReceiverMarryMessage;

    }

    }

    lambda表达式

    声明一个不带参数的委托

     delegate void Mydelegate();

    声明一个带参数的委托

    public delegate void Mydelegate(string name);

    // 声明一个带参数带返回值的委托

    /public delegate string

    /Mydelegate(string name);

    public static void Text()

    {

    Console.WriteLine ("不带参数的委托");


    }

    // public static void Main (string[] args)


    {

    Mydelegate d0 = new Mydelegate (MainClass.Text);

    d0.Invoke ();

    匿名函数--callback回调函数

    Mydelegate d1;

    d1 = delegate (){

    Console.WriteLine ("这是一个匿名函数");

    };

    d1 ();

    带参数的匿名函数

    Mydelegate d2;

    d2 = delegate(string name) {

    Console.WriteLine ("hi--"+name);

    };

    d2 ("你好");

    // //lamda表达式

    Mydelegate d3;

    d3 = (string name) => {


    Console.WriteLine ("hi--"+name);

    };

    d3 ("long");

    // //带参数带返回值

    Mydelegate d4;

    d4=(string name)=>name+"你好";


    Console.WriteLine (d4("中国"));

    }

    相关文章

      网友评论

        本文标题:委托与事件 匿名函数lambda表达式

        本文链接:https://www.haomeiwen.com/subject/svqomttx.html