【问题标题】:Object Reset method or new reference for event subscribers?事件订阅者的对象重置方法或新参考?
【发布时间】:2013-05-02 03:52:53
【问题描述】:

(使用 VS2010。假设性能不是问题)。

我有一个特定的对象,它为其所有属性更改实现事件。有时需要将对象“重置”为其所有默认属性值。最简单的方法就是构造一个新对象:

Object1= New MyObject

但是,对于原始对象的任何事件订阅者,这等价于更改所有属性值。例如,如果订阅者只监听属性A 的更新,那么它现在还必须意识到新对象构造的可能性。这似乎为订阅者增加了额外的努力。 (例如,也许我必须创建一个“NewObjectAssigned”事件,并且属性更改的订阅者也需要处理它。)

所以我想用 Reset 方法装备对象,所以上面的代码更改为:

Object1.Reset

这样 Object1 引用永远不会改变,Reset 会手动将所有属性更改为默认值,从而触发所有 propertychanged 事件。但这也感觉不太对劲,与仅仅声明一个新对象相比也很麻烦。我想我需要一种方法来手动重置所有属性或引发所有更改的事件,这让我很恼火——我必须记住在向类中添加新属性时更新此方法。或者也许这并没有我想象的那么成问题。

这是一个足够简单的场景,我确信有一个最佳实践,无论是哪种方式。哪个更可取?

【问题讨论】:

  • 您必须定义一些标准来判断哪个提案是“优选的”。一种选择是使用包装类来包装另一个类(包含属性)并简单地重新实例化它以重置为默认值。与适配器模式类似,适配器随后将提供事件并传递对实现类属性的访问。
  • 那么对于包装器类,当内部类被重新实例化时,包装器是否必须为了外部订阅者而引发每个属性更改事件?
  • 是的,通常它的包装不会引发事件,包装器会——所以,应该是相同数量的工作。

标签: c# events default-value


【解决方案1】:

如果您需要事件处理程序保持连接,那么您将希望使用重置而不是创建新实例。如果您的对象实现了INotifyPropertyChanged,那么您可以发送一个重置事件并将PropertyName 设置为null。

来自 MSDN:

propertyName 参数的空值或 null 表示所有属性都已更改。

【讨论】:

  • 不幸的是,这个对象没有实现 INotifyPropertyChanged,但仍然很高兴知道空/空 propName 表示全部更改 - 我从来不知道。
【解决方案2】:

我想我同意 Peter Ritchie 的第一条评论,即我最初的问题缺乏确定“首选”方法所需的细节。就目前而言,我可能会接受他关于包装类的建议,该类将负责处理新的对象引用并将事件公开给订阅者。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-07
    • 1970-01-01
    • 2017-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多