如果您不应该将集合返回给调用者,那么如何将一组数据返回给调用者?

Eri*_*bes 5 .net c# collections

我正在编写一个方法,旨在返回一个充满配置键和值的字典.构建这个字典的方法是动态的,所以我需要将这组键和值作为集合(可能IDictionary<string, string>)返回.在我的各种读物中(来源逃避了我),关于从方法调用返回集合类型的一般共识不是.

我理解这个政策的原因,我倾向于同意,但在这种情况下,我看不到其他选择.这是我的问题:有没有办法可以将这些数据返回给调用者,同时遵循这个原则?

编辑:我听到不允许这种行为的原因是,客户端要使用(但未修改)的集合或字典类型会暴露太多行为,从而产生调用者可以修改类型的错觉.例如,Dictionary具有Add和Remove方法,以及一个可变索引器.如果字典中的值是只读的,那么这些方法充其量是多余的.如果内部集合被暴露,则可以进一步造成损害,并且集合的"所有者"不会预期从外部来源对集合进行更改.

还有其他原因我听说过,但我无法回想起它们 - 这些是我的情况中最相关的.

编辑:更多说明:我遇到的问题是我正在构建一个API,所以我无法控制调用此函数的客户端.克隆字典不是问题,但我试图让我的API保持尽可能干净.使用"添加"和"删除"等方法返回字典意味着可以或应该修改集合,但实际情况并非如此.这里的修改是没有意义的,所以我不想通过返回类型的接口公开该功能的承诺.


解决方案:为了满足我对干净API的需求,我将编写一个自定义的Dictionary类,它不会公开变异方法Add和Remove,或者设置索引器.这种类型不会实现IDictionary,但我会编写一个方法ToDictionary来返回一个数据IDictionary.它将实现IEnumerable<KeyValuePair<TKey, TValue>>,以便访问可枚举的标准LINQ操作.现在我需要的是我的自定义词典类型的名称... =)谢谢大家.

Mic*_*rdt 10

从方法调用返回集合类型的一般共识不是.

我第一次听到这个,这对我来说似乎是一个愚蠢的限制.

我理解这个政策的原因

那他们呢?

编辑: 您引用反对收集集合的原因是特定的潜在问题,可以是特定的地址(通过返回只读包装器),而不会对返回的集合进行全面限制.但正如我了解你的情况,该集合实际上是由该方法构建的 - 在这种情况下,调用者所做的更改不会影响任何其他内容,因此不是您真正需要担心的事情,也不应该过于严格限制调用者应该能够使用专门为他创建的对象.

  • 我不认为抽象的纯度概念是增加任意限制的好理由.为什么调用者不能修改专门为他创建的集合?也许它可能有用.哎呀,你已经在计划*一个ToDictionary方法来回馈你刚刚带走的选项! (3认同)

Pau*_*her 7

这种限制的主要原因是,如果类返回成员集合,它会破坏多态性,常量和访问控制.如果要构建要返回的集合,并且该类不将其保留为成员,则这不是问题.

也就是说,你可能希望更加想想为什么要归还这个系列.你希望调用类能够对数据做什么?你能通过向你的类添加方法来实现这个功能,而不是返回一个集合(例如myobj.getvalueFromKey(s)而不是myobj.getdictionary()[s])?返回一个只暴露你想要的信息的对象,而不是简单地返回集合(例如MyLookupTable MyClass :: getLookupTable()而不是IDictionary MyClass :: getLookupTable())可能更合适.

如果您无法控制调用者,并且必须返回给定类型的集合,那么它应该是成员集合的副本,或者完全是新集合,被调用者不存储.