事件和代表在触发事件时进行排序

uda*_*day 5 .net c#

我最近参加了C#的采访,在那里我被问到一个关于C#中的事件和代表的问题

这个人问我一个事件说按钮被点击,这被称为第一个事件或代表?

委托是否调用事件或事件调用委托?

我们可以在c#中没有代表的情况下举办活动吗?

Eri*_*ert 10

这个人问我一个事件说按钮被点击,首先被调用:事件或代表?

当你打开一扇门,首先打开门:门把手

咦?

这个问题没有任何意义.你门把手打开一扇门,但你没有打开门把手.

"召集"一个事件意味着什么?事件不是你打电话的事情.事件是你提出的事情.提升事件调用委托相同.

委托是否调用事件或事件调用委托?

门是否打开门把手,或门把手是否打开门?

同样,这个问题没有意义.门把手不是可以"打开"的东西,门把手不会打开门 - 打开门,握住门把手.

代表是否致电该活动?没有; 事件不是可以被"召唤"的事物.该事件是否会调用该委托?不,提升事件代码会调用委托.

我们可以在c#中没有代表的情况下举办活动吗?

是的,在某种意义上,与事件关联的委托引用可以是空引用.但是每个事件都与委托类型相关联,并以某种方式与委托相关联.

整套问题向我表明提问者对事件与代表之间的关系没有很好的理解.考虑它的一个好方法是,事件只是一个包含对多播委托的引用的属性.虽然属性具有获取和设置属性值的特殊方法,但事件具有向多播委托添加和删除委托的特殊方法.


Eri*_*rix 5

事件是一种概念,它使用委托作为调用已订阅它们的方法的手段.

事件本身不会被调用.当一段代码引发一个事件时,它将通过调用委托来调用每个订阅的方法.


Kei*_*thS 0

事件只是在 .NET 中作为多播委托实现的代码构造。

当“引发”事件时(只能由与事件同一类中的代码完成;事件引发必须在“受保护”范围内发生),一次会以同步方式(但不一定)调用一个委托以任何确定性顺序。该事件是委托,因此当单击按钮引发事件时,委托将由运行时调用,该运行时已收到用户单击按钮的 GUI 区域的 Windows 消息。

语句“引发事件”和“调用委托”是等效的语句;这就像问“先有鸡还是先有鸡?”。

现在,事件经常级联,尤其是当我们谈论 UI 时。有一个 MouseUp 事件,在释放鼠标按钮时调用,该事件可以触发一个或多个其他事件,例如 MouseClick、MouseDoubleClick、DragDrop 等。您可能不会将处理程序附加到 MouseUp 事件,但有内置逻辑在 MouseUp 的幕后引发您要处理的 MouseClick 事件。因此,从这个意义上说,您可以说 MouseUp 事件“首先出现”并调用 MouseClick 处理程序委托。