【问题标题】:.NET C# Array Instantiation/Passing Theory.NET C# 数组实例化/传递理论
【发布时间】:2012-04-20 18:08:51
【问题描述】:

我有一个特殊的对象,它包含一个对象列表和列表的一堆附带属性。

我有一个函数可以将项目注入我的特殊对象的列表部分。该函数取决于列表附带的属性,因此我选择创建一个新对象,该对象同时包含属性和列表。

问题 1:谁负责在函数开始注入项目之前确保 List 不为空?

  1. 调用者是否应该创建一个新列表并将其传递给函数?

  2. 被调用者是否应该创建一个新列表并将其分配给对象,而不考虑传入的对象的状态?

  3. 是否应该将函数设计为在不修改对象的情况下接收对象并返回一个新列表,让调用者将返回的列表分配给它的特殊对象?

或者...还有其他我没有考虑过的选项吗?

相关问题 2:鉴于我的设计需要 List 附带的属性,我应该选择创建一个包含属性和 List 的新类,还是应该创建一个包含附加属性的 List 子类?

【问题讨论】:

  • 我会说这是一个习惯问题,例如我总是返回一个新对象。调用者可以只做MyObject obj = null; obj = MyFunc(); 甚至像MyObject obj = MyFunc(); 那样直接初始化它如果您希望调用者能够修改对象(或您的情况下的数组),您可以返回对象(或数组)的实例。否则,您可以执行复制并返回新对象(或实例的只读集合)。
  • 我很好奇是什么促使您将此添加为评论而不是可能的答案?我是 SO 的新手,如果确实是一个,我相信我不能将您的评论标记为答案(在我评估了其他潜在答案之后)。
  • 你是对的,但你的问题没有“正确”的答案,它看起来更像是一个讨论问题。

标签: c# .net arrays theory


【解决方案1】:

简而言之,从概念上讲,包含列表的对象负责拥有存储数据的有效方法,这意味着它应该负责在需要时实例化其列表。

如果对象被设计为表示对象的集合,那么它负责维护它在内部实际用于存储它们的任何内容,除非目标的一部分是让新对象成为多种类型的“包装器”集合,允许根据内部使用的集合类型自定义行为。

考虑一个列表。它在内部使用一个数组来存储数据,并根据需要处理所述数组的大小调整以存储新对象。您不必了解列表;从概念上讲,它是一个有序的索引集合,允许插入和删除元素。它可以用链表、红黑树或其他任何东西来实现;这些会对性能和复杂性产生影响。

回到正题。您的对象应该是具有附加属性的列表,应该隐藏其内部数据结构。用户不需要知道那里有一个 List 来保存元素。这意味着您的对象应该知道如何实例化它自己的内部数据结构,并公开调用者用来注入新元素的方法,这些新元素作用于内部列表。

一个例外是“包装器”,它添加了可以应用于任何其他类子集的新功能,重要的是允许用户指定新的类应该“包装”在一个具体用法。一个例子是 BlockingCollection。它增加了阻止正在对集合执行某些并发操作的线程的能力,直到它有效且安全地执行所述操作(例如,如果集合为空,则尝试从 BlockingCollection 获取项目的线程将被阻止,直到另一个线程添加一些东西)。创建时,可以指定 BlockingCollection 使用 IProducerConsumerCollection 接口的特定实现;这很可能是同一命名空间中的内置“并发”集合之一,例如 ConcurrentBag、ConcurrentQueue 或 ConcurrentDictionary。即使在这种情况下,也有一个“默认”选项;您可以在不指定要使用的内部 Concurrent 结构的情况下实例化 BlockingCollection 对象,并且该对象将默认为 ConcurrentQueue。

【讨论】:

  • 如果我提到细节,你的答案会改变吗:包含数组的对象是一个用于公共 API 的接口。因此,我不相信我可以为接口注入逻辑来“管好自己的事”。
  • 忽略我最后的评论。我有时会放出严重的脑屁。在接口的情况下,接口的任何实现都可以而且应该遵循您所概述的内容。
【解决方案2】:

假设您的列表是您的类实例的字段/成员,我建议new在类的构造函数中添加列表。

public class SpecialObject
{
    List<something> myList;
    public SpecialObject()
    {
        myList = new List<something>();
    }
}

或者在没有构造函数的情况下完成同样的事情:

public class SpecialObject
{
    List<something> myList = new List<something>();
}

【讨论】:

  • 我也忘了提到这种可能性。这就是我处理数组的方式,我想——因为我正在制作一个包含数组的特殊对象——我会提出谁真正应该负责数组的实例化的问题。
猜你喜欢
  • 1970-01-01
  • 2022-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-29
  • 2011-02-15
相关资源
最近更新 更多