C#中的事件-是OOP吗?

C#中的事件-是OOP吗?,c#,oop,events,C#,Oop,Events,自从我开始在c#中使用事件以来,我一直想知道它是否是面向对象的 让我解释一下。在Java中,它有EventListner,Observer/Observable,它必须继承哪个对象才能触发事件或侦听事件。我的观点是,在Java中,它必须是一个有责任通知订阅者或在收到通知后执行操作的对象。在c#中,我看到的是: public delegate void SomeHandler(); public event SomeHandler OnAction; ... //somewhere in the

自从我开始在c#中使用事件以来,我一直想知道它是否是面向对象的

让我解释一下。在Java中,它有EventListner,Observer/Observable,它必须继承哪个对象才能触发事件或侦听事件。我的观点是,在Java中,它必须是一个有责任通知订阅者或在收到通知后执行操作的对象。在c#中,我看到的是:

public delegate void SomeHandler();
public event SomeHandler OnAction;

...
//somewhere in the firing class
OnAction();

...
//somewhere else in a subscriber class
_generateReport.ReportSubmited += someMethod;

private void someMethod()
{
//do some job
}
没有类,只有方法和属性

那么,它是OOP吗?如果是,它是如何工作的

谢谢

它是OOP-C#只是对您隐藏了实现细节
someMethod()


在Java中,您必须手动继承和处理。

someMethod()
被声明为私有。它是一个类的私有成员,它是OOP,我看不到任何与OOP相矛盾的东西。事件只是两个使用委托进行操作的方法的集合(在您的案例中,如果在场景后面,则委托本身)。委托又是方法引用和调用目标对的链表。

负责保存处理程序列表的类型是
SomeHandler
类型,它是委托类型。您可以从适当的方法生成委托的实例,表示对该方法的调用。。。您可以将委托组合在一起,以表示一系列调用

基本上,将事件视为对观察者模式的语言/平台支持

您应该知道活动和代理在幕后是什么样子的-有关更多详细信息,请参阅my


非面向对象的部分是,尽管委托可以像任何其他对象一样传递,但事件不能:(您可以使用它们的反射等价物(
EventInfo
)但这不完全是一回事…

在许多场景中,比如当需要在不同程序集中的模块之间建立松散耦合关系时,使用委托和事件是一个非常好的主意,可以调用一个方法,而不必了解其代码,这样我们就可以清楚地解耦每个类的责任。 假设我们在完全不同的程序集中有两个类,如下所示:

        private Rectangle GetActiveWindowBounds(Func<IRunningAppActionResult> 
               methodOne , Func<IRunningAppActionResult>  methodTwo)
                 {
                  Task.Run(() => { return methodOne(); }).Wait();




 _clientAppRectangleBitmapHelper.GetBrowserActiveAreaByColor(Color.Red);
                      Task.Run(() =>  {return methodTwo();
                       }).Wait();
                        return _clientAppRectangle;
              }

OOP意味着什么?我想你没有看到。你不能在类之外有一个
event
类型的字段。请你发布一个更完整的例子,说明你看到的内容,好吗?SomeHandler实际上是一个类。delegate关键字通过一些编译器魔法创建了它。我很确定John Skeet很快就会留在这里把他的白马小费从他头顶上拿下来,所有涉及的IL和编译器的诡计。@Markust-我想你是说。@Chris-废话。用H给John小费的习惯。你是对的。我不把最后一部分称为非OO。封装是OOP的核心原则,事件只是其中的一种形式。@Martinho:但事件本身不能被用作对象,这可能是一个真正的难题。看看你必须做些什么才能在LINQ to Rx中以一般方式订阅事件…@Martinho:我想Jon不是在抱怨封装,而是抱怨它们不是一流的对象。@Jon:是吗?更多解释
     var browserRectangle = _browserWindowManager.GetActiveWindowBounds(
            () => this.SendActionWithResult(new 
                                 MakeBackgroundRedAction()),
                                         () => this.SendActionWithResult(new 
                  RevertBackgroundAction()));