.NET中的事件有一个标准模式-它们使用delegatetype接受一个名为sender的普通对象,然后是第二个参数中的实际“有效负载”,该参数应派生自EventArgs.第二个参数的基本原理来自EventArgs看起来很清楚(参见.NETFrameworkStandardLibraryAnnotatedReference)。它旨在随着软件的发展确保事件接收器和源之间的二进制兼容性。对于每个事件,即使它只有一个参数,我们也会派生一个自定义事件参数类,该类具有包含该参数的单个属性,因此我们保留了在未来版本中向有效负载添加更多属性的能力,而不会破坏现有的客户端代码.在独立开发组件的生态系统
每次我开始深入C#项目时,我都会遇到很多实际上只需要传递一个项目的事件。我坚持EventHandler/EventArgs练习,但我喜欢做的是:publicdelegatevoidEventHandler(objectsrc,EventArgsargs);publicclassEventArgs:EventArgs{privateTitem;publicEventArgs(Titem){this.item=item;}publicTItem{get{returnitem;}}}以后,我可以拥有我的publiceventEventHandlerFooChanged;publicevent
可以使用如下语法将事件从内部对象实例委托(delegate)给相应对象的事件处理程序:publicclassMyControl{publiceventEventHandlerFinish;privateWizardwizard;publicMyControl(Wizardwizard){this.wizard=wizard;//someotherinitializationgoingonhere...//THISiswhatIwanttodotochaineventsthis.wizard.Finish+=Finish;}}上述结构的动机是我有许多类似向导的UI流程,并希望将后退、前进
我正在连接一个事件以使用需要在触发后自行删除的lambda。我无法通过将lambda内联到+=事件(没有可访问的变量用于删除事件)来做到这一点,所以我设置了一个Action变量并将lambda移到那里。主要错误是它无法转换Action到事件处理程序。我认为lambda表达式可以隐式转换为事件处理程序,为什么这行不通? 最佳答案 Actiona=(o,ea)=>{};EventHandlere=a.Invoke; 关于c#-无法将Action转换为EventHandler?,我们在Stac
我讨厌EventHandler。我讨厌我必须投sender如果我想用它做任何事情。我讨厌我必须创建一个继承自EventArgs的新类使用EventHandler.我一直被告知EventHandler是传统,废话,废话……随便什么。但我找不到这个教条仍然存在的原因。有没有理由说创建一个新的代表不是一个好主意:delegatevoidEventHandler(TSendersender,Targs);那样sender将是类型安全的,我可以传递任何我想要的作为参数(如果我愿意,包括自定义EventArgs)。 最佳答案 如果您完全信任的代
有时,事件模式用于通过或subview模型在MVVM应用程序中引发事件,以像这样松散耦合的方式将消息发送到其父View模型。父View模型searchWidgetViewModel.SearchRequest+=(s,e)=>{SearchOrders(searchWidgitViewModel.SearchCriteria);};SearchWidgetViewModelpubliceventEventHandlerSearchRequest;SearchCommand=newRelayCommand(()=>{IsSearching=true;if(SearchRequest!=n
最近一直在想这段代码有没有什么显着的区别:publiceventEventHandlerSomeEvent;还有这个:publicdelegatevoidMyEventHandler(objectsender,MyEventArgse);publiceventMyEventHandlerSomeEvent;他们都做同样的事情,我无法分辨出任何区别。尽管我注意到大多数.NETFramework类都为其事件使用自定义事件处理程序委托(delegate)。这有什么具体原因吗? 最佳答案 你是对的;他们做同样的事情。因此,您可能应该更喜欢前
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:C#:Differencebetween‘+=anEvent’and‘+=newEventHandler(anEvent)’订阅事件有两种基本方式:SomeEvent+=newEventHandler(MyHandlerMethod);SomeEvent+=MyHandlerMethod;有什么区别,什么时候我应该选择一个而不是另一个?编辑:如果是一样的,那么为什么VS默认为长版本,使代码困惑?这对我来说毫无意义。
采用以下代码:privatevoidanEvent(objectsender,EventArgse){//somecode}下面的有什么区别?[object].[event]+=anEvent;//and[object].[event]+=newEventHandler(anEvent);[更新]显然,两者之间没有区别......前者只是后者的语法糖。 最佳答案 没有区别。在您的第一个示例中,编译器将自动推断您想要实例化的委托(delegate)。在第二个示例中,您显式定义了委托(delegate)。委托(delegate)推理是在