.NET C# 数组实例化/传递理论

本文关键字:理论 实例化 数组 NET | 更新日期: 2023-09-27 18:31:44

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

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

问题 1:在函数开始注入项目之前,谁负责确保列表不为 null?

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

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

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

或。。。还有其他我没有考虑过的选择吗?

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

.NET C# 数组实例化/传递理论

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

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

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

回到刚才的例子。您的对象(旨在成为具有其他属性的列表)应隐藏其内部数据结构。用户不需要知道那里有一个包含元素的列表。这意味着您的对象应该知道如何实例化其自己的内部数据结构,并公开调用者用于注入新元素的方法,这些元素作用于内部列表。

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

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

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

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

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