剑轩

事件与委托的区别

电脑版发表于:2019/9/29 17:05


事件是一种特殊的委托实例,其实就是在委托的前面加上一个event关键字

加上了event后就会出现一个闪电的标识,闪电的标识就表示一个事件


例如:我们看看winfrom中按钮的点击事件:

发现了前面有一个event关键字,我们在看看EventHandler是个什么东东

可以看到其实就是一个委托而已,也就是证明了我们说的事件就是在委托前面加了一个event关键字


事件是有限制的委托实例

加上event后,限制了委托的使用

1:它只能+=或者-=

2:要执行这个委托在外面不能执行,无法破坏代码的封装性


例如我们自己实现一个定时器:

public class MyTimer
{
    public event Action interval;
    public void Start(int timespan)
    {
        while (true)
        {
            if (interval != null)
            {
                interval();
                System.Threading.Thread.Sleep(timespan);
            }
        }
    }
}

  调用:

static void Main(string[] args)
{
    MyTimer mytime = new MyTimer();
    mytime.interval += mytime_interval;
    mytime.Start(1000);
    Console.ReadLine();
}

static void mytime_interval()
{
    Console.WriteLine("国庆快乐");
}

效果如下:

这里如果里边把event关键字删除掉

结果不会用任何的变化,但是外面可以直接给它委托赋值而不必使用+=或者-=,还可以直接赋值

这样当然就不好了,会破坏代码内部的逻辑,事件应该是我们内部触发的而不是外部可以调用!



当然事件还是一种标准

上面那个定时器委托使用的是action其实不太好事件应该还是一种标准,是一个有两个参数一个返回值的委托,也就是事件源和事件参数,也就是名字叫EventHandler的委托

我们来实现一个猫叫了的事件,猫叫的原因有很多比如:饿了,想恋爱的等

public class Cat
{
    public event EventHandler miao;

    public void Hungry()
    {
        CatEventArgs catEventArgs = new CatEventArgs();
        catEventArgs.reason = "饿了";
        miao(this, catEventArgs);
    }

    public void Love()
    {
        CatEventArgs catEventArgs = new CatEventArgs();
        catEventArgs.reason = "想恋爱了";
        miao(this, catEventArgs);
    }
}

原因就用事件参数来实现:

public class CatEventArgs : EventArgs
{
    public string reason { get; set; }
}

调用:

static void Main(string[] args)
{
    Cat cat = new Cat();
    cat.miao += cat_miao;
    cat.Hungry();
    cat.Love();
    Console.ReadLine();
}

static void cat_miao(object sender, EventArgs e)
{
    CatEventArgs catEventArgs = e as CatEventArgs;
    Console.WriteLine("猫因为" + catEventArgs.reason + "叫了");
}

效果如下:



关于TNBLOG
TNBLOG,技术分享。技术交流:群号677373950
ICP备案 :渝ICP备18016597号-1
App store Android
精彩评论
{{item.replyName}}
{{item.content}}
{{item.time}}
{{subpj.replyName}}
@{{subpj.beReplyName}}{{subpj.content}}
{{subpj.time}}
猜你喜欢