zoukankan      html  css  js  c++  java
  • c#委托和事件

      这两天看到c#的委托和事件这一章,书上讲得很简单直接,但是java里没得委托这个概念,在网上搜寻别人写的相关资料,感觉大多都写得太复杂了,或者就是直接讲这东西怎么声明,怎么定义,怎么实现,怎么用。看着更晕,知道怎么用,但是不知为何要用它,也不能够去很好的理解它。

    下面讲讲我个人的理解,也许不太准确,如果有理解错误的地方,希望看到的网友联系本人,指正一下,互相帮助学习嘛~

    委托:

      当我初看到委托的时候,我直接就想到了接口,来回忆一下接口。

      当我们要做什么事的时候,我们需要某个东西,我们要求这个东西要去做一些事,但是它要具体怎样去做我们不知道也不关心,于是我们定义一个接口,里面全是抽象方法,用于告诉别人我们要求要做这些事。然后把接口扔给别人去具体实现。我们就只管调用接口就行了。

      我理解的委托也是这样的,好比你要给自己修一座房子,你把设计图纸画好,然后扔给秘书,对他说“你去找些人来,让他们给我把房子建好。”

      是不是和接口很相似啊?

      但是如果你就只想让别人帮你做一件事就行了,而且那个人还可以做很多他自己的事,只在你要求他做的时候才需要他来做,定义一个接口是不是就显得很没有必要了呢?

      委托,是引用类型,指向方法。所以定义一个委托的时候,它看起来更像是在定义一个方法,而不同于定义一个类。

    //定义一个委托
    public delegate int PlayMedia();
    //声明一个委托实例
    public event PlayMedia playmedia;

      用delegate关键字来创建委托。

      event关键字告诉编辑器这个委托只能够定义该委托的类调用,并且只能被其他类分别使用用+=和-=运算符来订阅或者取消订阅,当然这里也可以不要event关键字。

      委托的实现方法要和委托具有一样的返回类型和签名,但是非静态方法和静态方法都可以。

    事件:

      事件其实就是委托,只不过委托可以是任何事,但是事件通常是指某些动作或者某些状态改变之类,.net中的事件还有自己的规范。

      .net中的事件处理器通常返回void类型,并且取得两个参数,第一个参数是定义委托的那个类的实例,第二个参数是一个EventArgs(事件数据的基类)的派生类对象。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                Clock clock = new Clock();
                //(实现委托)绑定事件
                ClockA a = new ClockA();
                a.Subscribe(clock);
                ClockB b = new ClockB();
                b.Subscribe(clock);
    
                //调用clock的run方法
                clock.Run();
            }
        }
        /// <summary>
        /// 事件参数类
        /// </summary>
        class TimeInfoEventArgs : EventArgs
        {
            public int Hour { get; set; }
            public int Minute { get; set; }
            public int Second { get; set; }
    
            public TimeInfoEventArgs(int hour, int minute, int second)
            {
                this.Hour = hour;
                this.Minute = minute;
                this.Second = second;
            }
        }
        /// <summary>
        /// 时钟类
        /// </summary>
        class Clock
        {
            //声明一个私有变量用于存储当前的秒钟
            private int second;
            /// <summary>
            /// 定义一个委托(秒钟改变触发事件)
            /// </summary>
            /// <param name="clock"></param>
            /// <param name="e"></param>
            public delegate void SecondChangeHandler(object clock, TimeInfoEventArgs e);
            //声明一个委托实例
            public event SecondChangeHandler SecondChanged;
    
            public void Run()
            {
                for (; ; )
                {
                    //暂停100毫秒
                    Thread.Sleep(100);
                    //获取当前系统时间
                    System.DateTime dt = System.DateTime.Now;
                    //如果秒钟发生改变
                    if (dt.Second != second)
                    {
                        //如果有订阅者(事件触发器)
                        if (SecondChanged != null)
                        {
                            //通知订阅者(触发事件)
                            SecondChanged(this, new TimeInfoEventArgs(dt.Hour, dt.Minute, dt.Second));
                        }
                        //改变存储的秒钟
                        this.second = dt.Second;
                    }
                }
            }
        }
        class ClockA
        {
            //与clock类的委托绑定
            public void Subscribe(Clock clock)
            {
                clock.SecondChanged += new Clock.SecondChangeHandler(TimeHasChanged);
    
            }
            public void TimeHasChanged(object clock, TimeInfoEventArgs e)
            {
                System.Console.WriteLine("SubscribeA Current Time : {0}:{1}:{2}", e.Hour.ToString(), e.Minute.ToString(), e.Second.ToString());
            }
        }
        class ClockB
        {
            public void Subscribe(Clock clock)
            {
                clock.SecondChanged += new Clock.SecondChangeHandler(TimeHasChanged);
    
            }
            public void TimeHasChanged(object clock, TimeInfoEventArgs e)
            {
                System.Console.WriteLine("SubscribeB Current Time: {0}:{1}:{2}", e.Hour.ToString(), e.Minute.ToString(), e.Second.ToString());
            }
        }
    }

      

  • 相关阅读:
    高可用的MongoDB集群-实战篇
    【转载】特征选择常用算法综述
    【转载】Pytorch tutorial 之Datar Loading and Processing
    论文笔记系列-Well Begun Is Half Done:Generating High-Quality Seeds for Automatic Image Dataset Construction from Web
    重新定义Pytorch中的TensorDataset,可实现transforms
    【转载】机器学习之特征工程
    Pytorch里的CrossEntropyLoss详解
    Python日志模块logging用法
    【转载】如何进行数据变换
    【转载】使用sklearn优雅地进行数据挖掘
  • 原文地址:https://www.cnblogs.com/huhy/p/3532323.html
Copyright © 2011-2022 走看看