是否需要封装集合?

时间:2010-11-08 14:22:02

标签: .net oop collections encapsulation

是否需要封装集合?

private List<Item> items;

public Items Items
{
    get { return this.items; }
    set { this.items= value; }
}

或只是

public List<Item> Items;

编辑:

  • 有没有办法绑定到集合而不暴露公共getter?

7 个答案:

答案 0 :(得分:4)

我通常将集合公开为只读。通常没有理由分配新的集合。我将在构造函数或属性getter中实例化一次集合。这减少了空引用错误的可能性。

答案 1 :(得分:3)

将收藏公开是一个非常糟糕的主意。虽然封装字段在任何情况下都很重要,但集合更为重要。

集合本身通常不是您真正关心的对象。因此,您班级的来电者不应该设置,替换它甚至将其取走(例如:设置为null)。它应该只关心其中的项目。如果您可以从外部设置列表实例,则可能会使您的类的多个实例共享同一个列表实例。这将产生一些令人讨厌的副作用。

您的类负责(至少)创建列表实例以确保它是专用列表而不是空引用。

公开的getter暴露列表实际上就像完全暴露它一样。这是你应该做的最小封装,它实际上就像没有封装一样。

完全封装是通过仅将项目公开为IEnumerable并在单独的方法或属性中提供添加,删除,计数和类似操作来完成的。你需要的越多,它就越复杂。如果您真的不需要从外部进行许多基本操作并在课堂上尽可能多地进行管理,那么它非常有用。

答案 2 :(得分:2)

在.NET世界中,公共字段通常是不受欢迎的。此外,来自方法或属性的returning null collections也不受欢迎。因此,我绝对会“封装”这个系列。

答案 3 :(得分:1)

.net中有一个标准,新实例化的对象初始化其集合以最小化空引用。您会注意到大多数框架库都遵循这一点。

public class PotOfUnicorns
{

    private List<Item> items = new List<Item>();

    public Items Items
    {
        get { return this.items; }
        private set { this.items= value; }
    }

}

答案 4 :(得分:1)

有时我把它挂起来......

List<Item> _items;
public Items Items
{
    get 
    {
        if (_items == null) _items = new List<Items>();
        return _items;
    }
    private set { _items = value; }
}

答案 5 :(得分:1)

建议您不要将收集资产制定者公开;请参阅MSDN上的this rule。更好的做法是仅公开界面而不是具体类型。

class Example
{
     public Example()
     {
         this.MyList = new List<string>();
     }

     public IList<string> MyList { get; private set; }
}

答案 6 :(得分:1)

创建自定义集合以包装标准集合,以便您可以控制呼叫者所做的事情是最佳选择,但是它有成本

我认为这取决于有多少不同的人会根据您的对象模型编写代码,并且这些人与您一样同一个团队的天气。

你通过封装你的收藏来阻止呼叫者做“坏事”;这可能会节省调用者的调试时间,并使您的调用者更容易计算如何使用您的API。

因此,这是您使用对象模型的程序员的时间和时间之间的交易。