在C#中,我们可以想象在不编写代理的情况下编写自己的事件吗?

时间:2009-10-30 15:26:06

标签: java c# delegates

我在Java中学习了面向对象。现在在C#中开发。这意味着我从未真正了解过分裂的功能,但我知道如何使用它们。

最近我发现了这个页面http://java.sun.com/docs/white/delegates.html

如果Java能够创建没有delagates的事件,是否可以在C#中执行相同的操作?我们能不能编写自己的事件而不写一个代表?

(问题已经用法语here提出)

5 个答案:

答案 0 :(得分:8)

是的,您可以使用单方法接口而不是委托。您还需要在添加/删除和调用方面实现委托的多播特性。然而,由于接口具有不同数量和类型的参数,因此很难有一个类实现多播并且以类型安全的方式实现Invoke。当然,你可以拥有一堆:Multicast<T>Multicast<T1, T2>等。(同样的类也可以处理异步执行。)

颈部的另一个痛苦是你每个类只能实现一次接口,即使你想要几个不同的处理程序 - 所以你有很多嵌套类。

关于委托几乎没有什么特别的魔法 - 它们只是一个非常有用的抽象,并且使用lambda表达式,匿名方法和表达式树的语法糖,它们甚至更好。

答案 1 :(得分:7)

不,没有代表,你不能在C#中做事。在C#中,事件被定义为委托:

  

event是一个允许类或对象提供通知的成员。 event被声明为字段,除了声明包含event关键字,类型必须是委托类型。

但是,您可以使用Observer pattern模仿事件。

微软对Sun的白皮书answer值得一读。

答案 2 :(得分:1)

这是一个非常古老的文件,看看它是从哪里获得的。如果需要,您可以在.NET中执行完全相同的操作。所有“Java Way”所做的都是利用继承。这很好,但对于许多人来说,“函数指针”语义更简单,更简洁。

答案 3 :(得分:0)

是的,你可以。您可以使用预定义的委托。 (我不确定你的经验水平是什么,你真正在问什么)

答案 4 :(得分:0)

为什么你想要这样做呢? 我的意思是,如果您有一个规则引擎,或者命令不仅仅是事件处理程序,那么请确定:您将需要实现一个接口,因为除了您要触发的实际代码之外,您还将拥有状态和行为。

但是如果在引发事件时提供一些代码来触发,那么就没有理由不使用代理。

委托是对方法/函数指针的精简抽象,因此它们增加了很少的开销。和IMO一样,不应仅仅为了它而添加开销。