【问题标题】:Avoid Generic Lists in Base Class - Should I Follow the Same Rule for Dictionary?避免基类中的通用列表 - 我应该遵循相同的字典规则吗?
【发布时间】:2016-05-09 08:21:50
【问题描述】:

我是advisedList<string> 属性更改为Collection<string>,在一个基类中,因为它更适合继承。

此“规则”被引用:https://msdn.microsoft.com/en-us/library/ms182142.aspx

System.Collections.Generic.List 是一个通用集合,它是 专为性能而不是继承而设计。 System.Collections.Generic.List 不包含虚拟成员 这使得更容易改变继承类的行为。这 以下泛型集合是为继承而设计的,应该 被公开而不是 System.Collections.Generic.List。

System.Collections.ObjectModel.Collection<T>

System.Collections.ObjectModel.ReadOnlyCollection<T>

System.Collections.ObjectModel.KeyedCollection<TKey, TItem>

类似的规则是否适用于Dictionary&lt;string, string&gt;

我问是因为它也在 System.Collections.Generic 命名空间中。或者我理解错了,这条规则只适用于Lists

顺便说一句,Dictionary 的目的是保存错误(格式与 ModelState 类似)。我目前不确定我将在哪个阶段添加错误。


如果我应该在基类中避免Dictionary&lt;string, string&gt;,我应该使用什么来代替它?

我遇到过KeyedCollection,但不确定这是否是一个好的替代品。

【问题讨论】:

  • 等一下。你到底想达到什么目的?您是想从集合继承还是只是想将列表/字典用作基类中的属性/字段?
  • 这是一个用于保存错误的属性(与 ModelState 错误的格式相似)。我目前不确定我将在哪个阶段将错误添加到字典中。

标签: c# list generics inheritance dictionary


【解决方案1】:

所以基本上你被告知的内容对于你想要的用例可能是错误的。

msdn 文章中的语句表示继承,如果您想通过从它派生来创建自己的集合实现,如下所示:

public class MyCollection : Collection&lt;MyType&gt;

在这种情况下使用Collection&lt;T&gt; 的优点是您可以显着改变行为,因为它公开了以下可以被覆盖的方法:ClearItemsInsertItemRemoveItemSetItem。当您从 List&lt;T&gt; 派生时,您根本无法覆盖任何方法(标准的 ToStringEqualsGetHashCode 除外)。

但正如您在评论中所说,您使用 List/Dictionary/Collection 作为属性。因此,它取决于您自己的用例。

如果您希望派生类只使用基类中的集合,您可以让它成为您认为最适合您需求的任何东西。但是,如果您认为派生类会更好地知道要使用哪个集合,那么您应该 从System.Collections.Generic 命名空间中选择一个接口。

我不会告诉你应该使用哪些类型或接口,因为这在很大程度上取决于你需要哪些功能。

顺便说一句:KeyedCollection 只能用于创建您自己的键值集合(它是抽象的)。因此,将KeyedCollection 作为属性意味着您还需要实现KeyedCollection

【讨论】:

  • 这非常清晰且内容丰富 - 非常感谢!
【解决方案2】:

Dictionary&lt;TKey, TValue&gt; 没有任何可以用来代替它的基类。使用接口可能会更好(IDictionary&lt;TKey, TValue&gt;IReadOnlyDictionary&lt;TKey, TValue&gt; - 两者都由Dictionary 实现),但这取决于您的需求。

请注意,很难表达属性是返回内部存储还是克隆(因此当调用者更改对象时会发生什么) - 您可能需要考虑 IEnumerable&lt;T&gt; 或隐藏字典作为实现细节的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-15
    • 2012-05-30
    • 1970-01-01
    • 2013-10-18
    • 1970-01-01
    • 2012-10-14
    • 2023-03-09
    • 1970-01-01
    相关资源
    最近更新 更多