.NET事件最佳实践 - 通过属性公开或在EventArgs中返回

时间:2011-02-16 02:28:55

标签: c# events class

我不确定事件处理/类设计的最佳实践。

我有一个类有一个方法Discover。当方法完成时,它会引发一个事件DiscoveryCompleted。 DiscoveryCompleted事件具有EventArgs。

在Discover方法中,创建了一个对象列表。如果DiscoveryCompleted事件在EventArgs中触发(仍然需要创建一个派生自EventArgs的类),或者在类上设置为属性(ReadOnlyCollection),则应返回这些内容。我发现了一个bool,它在DiscoveryCompleted触发时设置,因此可用于确定是否应该填充数据。

4 个答案:

答案 0 :(得分:3)

如果数据是可传递的(在事件触发后值可能会发生变化,并且您希望订阅者能够查看与该特定事件相关的数据)或者与您的组件没有直接关系(结果是异步调用组件以后不会自己使用它,然后在事件args中返回它。

否则,如果将值作为属性暴露在组件上(忽略您的事件)是有意义的,那么执行此操作并且不必担心EventArgs。如果没有,那么将其包含在args中。

答案 1 :(得分:1)

我认为大多数开发人员会在继承自EventArgs的类中返回它们。这样,订阅您的事件的任何方法都会在其事件处理程序中得到结果。

class EventArgsX : EventArgs {
        public IEnumerable<object> YourCollection { get; set; }
}

instance.SomeEvent += (s, args) => {
   foreach(object O in args.YourCollection){
      //do something
   }
}

遗漏了很多,但我相信你明白了。

答案 2 :(得分:1)

这取决于相关数据的性质。如果数据成为类的一部分是有意义的,那么应该有一个属性。如果类封装数据没有意义,那么为它创建一个EventArg类。

考虑如何完成控件事件。 CheckBox.CheckChanged没有通过Checked状态,因为它作为CheckBox类的属性是有意义的,但是KeyPress事件传递了KeyPressEventArgs,因为按下的键与CheckBox本身无关。

答案 3 :(得分:0)

我认为这最终归结为您希望使用代码启用的体系结构/可扩展性点。 Discover函数的使用者是否总是希望/需要与发现的object进行交互?如果是这样,那么应该从Discover方法返回它们。但是,如果调用Discover使这些对象在内部与其他方法一起使用,并且知道哪些对象被发现是可选的(或者您不希望每次都在类核心功能之外对它们执行某些操作),那么提供通过活动提供的信息是一个不错的选择。