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
从方法调用返回集合类型的一般共识不是.
我第一次听到这个,这对我来说似乎是一个愚蠢的限制.
我理解这个政策的原因
那他们呢?
编辑: 您引用反对收集集合的原因是特定的潜在问题,可以是特定的地址(通过返回只读包装器),而不会对返回的集合进行全面限制.但正如我了解你的情况,该集合实际上是由该方法构建的 - 在这种情况下,调用者所做的更改不会影响任何其他内容,因此不是您真正需要担心的事情,也不应该过于严格限制调用者应该能够使用专门为他创建的对象.
这种限制的主要原因是,如果类返回成员集合,它会破坏多态性,常量和访问控制.如果要构建要返回的集合,并且该类不将其保留为成员,则这不是问题.
也就是说,你可能希望更加想想为什么要归还这个系列.你希望调用类能够对数据做什么?你能通过向你的类添加方法来实现这个功能,而不是返回一个集合(例如myobj.getvalueFromKey(s)而不是myobj.getdictionary()[s])?返回一个只暴露你想要的信息的对象,而不是简单地返回集合(例如MyLookupTable MyClass :: getLookupTable()而不是IDictionary MyClass :: getLookupTable())可能更合适.
如果您无法控制调用者,并且必须返回给定类型的集合,那么它应该是成员集合的副本,或者完全是新集合,被调用者不存储.