当前位置: 首页 > 编程语言 > C#

单例事件分享

时间:2023-04-10 10:39:44 C#

单例事件我正在重构一些旧代码,我有很多静态事件,比如这个publicstaticeventActionUpdated;publicstaticvoidOnUpdated(){if(Updated!=null)Updated();我发现使用惰性单例通常比使用静态类更好:所以我重构了那些单例,现在我有代码分析抱怨。这样的事件显然得罪了CS1009,但我有一些疑问:在使用事件时,每个人都期望(objectsender,SomeEventArgsargs),这是唯一的原因吗?总而言之,这是我的主要问题(但我希望澄清其他问题):CS1009和单身人士,我应该修复事件还是简单地抑制消息?PS:相关主题:这个,这个和这个。我发现了这个问题。根据事件设计指南,我必须使用Event(忽略问题),其中T基于EventArgs类。关于静态事件中的发送者:在静态事件中,发送者参数应该为空。这是一个设计指南,对我来说可能不太好,但会受到其他人(正在阅读/维护我的代码的人)的欢迎。它为我打破了KISS和YAGNI的原则。越想越不知道该怎么办。我会改正你的错误。一般设计指南确实是(objectsender,EventArgse)签名。这是一个约定,它与代码一致性、代码可读性等有关。遵循此模式将有助于其他人将处理程序附加到您的事件。一些一般的提示/答案:如果你想使用带有惰性定义的单例模式,这里有一个完整的例子。请注意,事件不是静态的,因此发送者包含对单个实例的引用:publicclassEventArgs:EventArgs{publicEventArgs(Tvalue){this.Value=value;}公共T值{得到;放;}}publicclassEventArgs2:EventArgs{publicintValue{get;放;}}internalstaticclassProgram{privatestaticvoidMain(string[]args){Singleton.Instance.MyEvent+=(sender,e)=>Console.WriteLine("MyEventwithemptyparameter");Singleton.Instance.MyEvent2+=(sender,e)=>Console.WriteLine("MyEvent2withparameter{0}",e.Value);Singleton.Instance.MyEvent3+=(sender,e)=>Console.WriteLine("MyEvent3withparameter{0}",e.Value);Singleton.Instance.Call();控制台.Read();}}publicsealedclassSingleton{privatestaticreadonlyLazylazy=newLazy(()=>newSingleton());publicstaticSingletonInstance{get{returnlazy.Value;}}//////防止创建类的默认实例。///privateSingleton(){}//////没有任何关联数据的事件ata///公共事件EventHandlerMyEvent;//////具有特定类作为关??联数据的事件///publiceventEventHandlerMyEvent2;//////具有泛型类作为关联数据的事件///publiceventEventHandler>MyEvent3;publicvoidCall(){if(this.MyEvent!=null){this.MyEvent(this,EventArgs.Empty);}if(this.MyEvent2!=null){this.MyEvent2(this,newEventArgs2{Value=12});}if(this.MyEvent3!=null){this.MyEvent3(this,newEventArgs(12));}控制台.Read();编辑:如果您还需要将两个值传递给EventArgs可以构建一些EventArgs最终,EventArgs>也是可能的,但是对于超过2个值,我将构建一个特定的XXXEventArgs类,因为它更容易阅读比EventArgs.Value2或EventArgs>.Value.Item1XXXEventArgs.MyNamedBusinessPropertyEventArgs>.Value.Item1。关于KISS/YAGNI:请记住,(objectsender,EventArgse)契约是关于代码一致性的。如果某些开发人员使用您的代码将处理程序附加到您的事件之一,我可以向您保证,他会喜欢这样一个事实,即您的事件定义与BCL本身中的任何其他事件定义一样,因此他会立即知道如何使用您的正确编码。除了代码一致性/可读性之外还有其他优点:我从EventArgs继承了我的自定义XXXEventArgs类,但是您可以构建一些基本的EventArgs类并从中继承。参见例如MouseEventArgs和所有继承自它的类。重用现有类比提供具有5/6相同属性的多个委托签名要好得多。例如:publicclassMouseEventArgs:EventArgs{publicintX{get;放;}publicintY{得到;放;}}publicclassMouseClickEventArgs:MouseEventArgs{publicintButtonType{get;intTimeBetweenClicks{得到;放;}}公共类测试{公共事件EventHandlerClickEvent;公共事件EventHandlerDoubleClickEvent;}publicclassTest2{publicdelegatevoidClickEventHandler(intX,intY,intButtonType);请参阅下面的重复属性=>publicdelegatevoidDoubleClickEventHandler(intX,intY,intButtonType,intTimeBetweenClicks);公共事件DoubleClickEventHandlerDoubleClickEvent;还有一点就是使用EventArgs可以简化代码的可维护性。想象以下场景:publicMyEventArgs:EventArgs{publicstringMyProperty{get;放;}}公共事件EventHandlerMyEvent;...if(this.MyEvent!=null){this.MyEvent(this,newMyEventArgs{MyProperty="foo"});}...someInstance.MyEvent+=(sender,e)=>SomeMethod(e.MyProperty);如果想给MyEventArgs添加一些MyProperty2的属性,不需要修改所有已有的事件监听器即可以上就是《C#学习教程:单身人士的EventArgs》的全部内容。如果对你有用,需要进一步了解C#学习教程,希望你多多关注——publicMyEventArgs:EventArgs{publicstring}publicstringMyProperty2{get;放;}}公共事件EventHandlerMyEvent;...if(this.MyEvent!=null){this.MyEvent(this,newMyEventArgs{MyProperty="foo",MyProperty2="bar"});}...//我没有更改事件处理程序。如果SomeMethod()不需要MyProperty2,那么一切都已经很好了。MyEvent+=(sender,e)=>SomeMethod(e.MyProperty);本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: