我在Java中学习了面向对象。现在在C#中开发。这意味着我从未真正了解过分裂的功能,但我知道如何使用它们。
最近我发现了这个页面http://java.sun.com/docs/white/delegates.html。
如果Java能够创建没有delagates的事件,是否可以在C#中执行相同的操作?我们能不能编写自己的事件而不写一个代表?
(问题已经用法语here提出)
答案 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一样,不应仅仅为了它而添加开销。