关于事件发生器的原理是不是采用编写代码方式对每个EVENT轮询,还是。NET有什么消息机制呢(3分)

  • 主题发起人 zengxiaomeng
  • 开始时间
Z

zengxiaomeng

Unregistered / Unconfirmed
GUEST, unregistred user!
对于C#的事件处理好难理解,望高手指点一下
 
C#的事件是通过委托来实现的,而委托是通过安全函数指针叫消息驱动来完成的。
 
我也说得不完全,但我说的可以让你加深对事件的理解有帮助。
C#中事件是基于委托实现的。委托相当于C++的函数指针,但有2个附加好处:1。安全性,2。可以指向多个函数地址而不再只能指向一个函数地址。
对于第一个好处没什么多说的,关键在于第2个好处:想想看,当一个事件触发时,关注此事件的处理器们都要分别做出各自的动作(如单击控件按键,会看见按键变凹了,然后就执行你写的处理函数的代码)。可见这是两个函数的动作:1。按键变凹,2。执行你写的代码。
这样你就可用委托(C#的函数指针)指向这两个处理函数。
(其实在委托中有个链表保存指向的每个函数,这就是它能指向很多函数的原因,而委托本来就是一个类,当你用了Delegate关键字后实际上是你从System.Delegate类派生了个类,而在类中当然可容下这个链表的数据结构变量)。
事件就是在你定义好了此委托后,再写一句含event的关键字代码,就定义好了。如:
public Delegate void MyDelegate(string s);//定义委托。
public event MyDelegate Changed;//Changed为定义事件。
public void Proc1(string s1)
{Console.WriteLine(s1);}
public void Proc2(string s2)
{Console.WriteLine(s2);}
Changed+=MyDelegate(Proc1("aaaaa"));
Changed+=MyDelegate(Proc2("bbbbb"));//用+=重载符就完成了将两个函数加入链表的任务
再写个事件触发函数,在它内部执行上面的委托(实际执行2个动作)。
void OnChanged()
{ if(Changed!=null)
Changed;
}
这样当你要触法此事件是,你要显式的调用OnChanged函数才行,系统不会知道它何时被触发。但也可发生了某事实后人为激活此OnChanged函数。如你的属性变了,会出发此事件:
private string name=null;
public string Name//定义属性
{
set
{
if(name!=value)
{
name=value;
OnChanged();//当值改变时,必须显式调用触发函数,否则系统不会自动触发
} //但这样写了后在你的程序代码其它部分直接改变Name属值
} //值会自动执行OnChanged而那时就不用你再显式调用了。
get
{
return name;
}
}
好了,我也只能说出我的理解了,上面代码是随手写的可能有错但关键在于思想。
若还不太懂可以去买本C#技术内幕之类的书深入看看,那个更详细。
 
接受答案了.
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
顶部