[终身学员辅导]晓东-04.NET Framework-事件和委托的辅导

[ 728 查看 / 2 回复 ]

交谈中请勿轻信汇款、中奖信息,勿轻易拨打陌生电话。

AzrealKillua  21:23:41
老师 我在看委托和事件 有个问题:
AzrealKillua  21:24:05
static void Main(string[] args)
        {
            气球 qiu = new 气球();
            小孩子 boy = new 小孩子();

            qiu.baozha+= new 爆炸EventHandler(boy.听到爆炸);

            qiu.充气(50);
            qiu.充气(50);

        }
AzrealKillua  21:24:18
就是这个例子 我改写了下
AzrealKillua  21:24:31
//public event 爆炸EventHandler 爆炸Event = null;
        public 爆炸EventHandler baozha = null;
        public void 充气(int 体积)
        {

            this._当前体积 += 体积;
            //可能 会爆炸
            if (this._当前体积 > this._max体积)
            {
                //应该发生事件
                //4.事件源内部激发事件
                if (this.baozha != null)
                {
                    this.baozha(this._当前体积);//语法:事件名(参数)
                }
            }
        }
张波老师  21:24:58
你好!
AzrealKillua  21:24:59
你原来是用一个事件去监听爆炸的 ,现在我直接用委托也可以
AzrealKillua  21:25:10
为什么要用一个事件呢
张波老师  21:25:12
公开委托?
AzrealKillua  21:25:13
好处是?
AzrealKillua  21:25:29
委托不都是公开的么
张波老师  21:25:35
可以...
张波老师  21:25:42
从这个角度理解:
张波老师  21:26:26
事件体现的是一个对象对外部的"通知",委托是相对静态的,只是"对方法的调用"
张波老师  21:27:40
事件同时也体现了"响应"机制,如按钮的Click事件,如果用委托,虽然从代码上运行效果都一样,但从理解上,不如事件来的更明确
AzrealKillua  21:28:29
有没有什么明显点的区分它们区别的例子?比如只能用事件不能用委托之类的
张波老师  21:32:31
这个没有,因为定义事件的时候,事件的类型就是"委托",只是多了一个关键字"event"才变成事件.如果没有"event"代码同样效果.
AzrealKillua  21:34:17
那样的话 那我以后使用的时候 是要用委托还是事件是随意的?不会对具体实现产生影响?
张波老师  21:35:38
可以这样理解,但不提倡.因为:事件就是事件,委托就是委托.建议你从面向对象上再琢磨"事件的通知机制"
如:一个气球公开一个委托:"爆炸的处理程序"(暂用中文),就不如公开一个事件"爆炸"来的更直观和面向对象
也更能体现"一个对象通知外界监听者"的含义
AzrealKillua  21:38:31
那事件和委托是不是一对一的?
张波老师  21:40:52
这就是事件和委托的关系了,事件必须有一种委托相对应(定义时指定),也就是一个事件 对应一个委托.但反过来,一个委托却可以对应多个事件,因为可以有多个类定义不同事件,或一个类中定义多个事件,但都可以使用同一个委托类型.最典型的例子就是标准的EventHandler(object,EventArgs)委托
AzrealKillua  21:43:53
哦,那个我还没看呢
张波老师  21:44:31
你手上的教程后面就马上有讲到了.
AzrealKillua  21:45:25
感觉这东西 用起来简单 理解起来麻烦
张波老师  21:46:58
是的,但是,只知其一,不知其二,是有害的,特别是后面还会应用到事件,如ASP.NET中的WebUserControl部分,现在理解透彻了,对后面的应用是有好处的
本主题由 管理员 张波老师 于 2010-7-28 22:10:39 执行 移动主题 操作
TOP

交谈中请勿轻信汇款、中奖信息,勿轻易拨打陌生电话。

AzrealKillua  22:03:59
刚刚网上 差了下 看到了个很好的解释
AzrealKillua  22:04:00
事件时你要么订阅该事件,要么取消订阅。
委托的时候怎么样?人家一个=操作,你的方法就不会被执行了。而事件时,你根本无法破坏委托执行时其他被+=(订阅)的代码的执行
AzrealKillua  22:04:41
是不是这么回事啊?
张波老师  22:05:06
舍近求远了..这是从+=操作符的角度来讲的,
张波老师  22:05:19
你如果觉得这样能帮你理解,也很好
AzrealKillua  22:05:51
其实是这样的 就是我想知道以后使用的话是用委托还是事件
AzrealKillua  22:06:03
那我以后就都用事件?
AzrealKillua  22:06:18
省得 还要考虑该用哪个

张波老师  22:06:32
事件体现的是一个对象对外部的"通知",委托是相对静态的,只是"对方法的调用"
张波老师  22:07:17
同时.如果公开委托,则可以由外部来主动调用,
张波老师  22:08:12
如果使用事件,则只能由对象自己"激发事件",不能由外部主动调用,外部只能"注册事件",也就是说,只能监听
AzrealKillua  22:08:58
加了public也不行?
张波老师  22:09:32
用委托,还是事件,你可以根据这一点来区分:是不是由类自己来通知外部,而杜绝外部直接对这个类直接控制.从这个角度上讲,其实还是体现了OO中的"封装性".
张波老师  22:09:46
加public也不行,这是一定的
张波老师  22:10:35
public只是"可访问性",也就是说能不能访问到,不代表能不能"调用"
张波老师  22:11:18
Button.Click事件,你见过btn.Click这种调用方式吗?不能的.
张波老师  22:11:37
btn.Click();这样,也不行,这是方法,不是事件.
张波老师  22:12:19
但如果Click对于Button来说,只是定义为"委托"成员,就可以直接调用btn.Click(参数列表)了..
TOP

交谈中请勿轻信汇款、中奖信息,勿轻易拨打陌生电话。

AzrealKillua  22:22:58
对的:
AzrealKillua  22:23:01
//爆炸EventHandler b= new 爆炸EventHandler(boy.听到爆炸);
        //b(100);
        qiu.爆炸Event += new 爆炸EventHandler(boy.听到爆炸);

AzrealKillua  22:23:34
委托可以直接new出来 事件要基于对象
张波老师  22:23:42

张波老师  22:23:49
这样清晰了吗?
AzrealKillua  22:24:19
恩 应该可以了 ,以后多看看 相关应用就行
张波老师  22:24:29

AzrealKillua  22:24:38
谢谢老师
张波老师  22:24:55
不客气!有问题再问我.
AzrealKillua  22:25:06
好的
TOP