IDictionary或者NameValueCollection
时间:2020-03-06 14:49:56 来源:igfitidea点击:
我当前正在编写一个接口,以允许应用程序将异常数据发送到中央存储库以进行支持。我对如何传递额外的上下文数据感到困惑:
public interface IExceptionNotifier { void Notify(Exception ex, NameValueCollection context); //this void Notify(Exception ex, IDictionary<string, string> context); //or this }
创建查找时,我经常发现自己处于相似的位置。忽略异常通知程序概念是否良好,是否最好使用IDictionary <string,string>或者NameValueCollection`?你为什么要选一个呢?
解决方案
如果上下文是一个一次性的值,并且(这里是重要的部分)将不会被序列化,例如为了将数据发送到另一个系统,我会选择IDictionary,因为它可以使界面使用更加灵活。
另一方面,如果上下文一直保持不变或者上下文将被序列化,请使用NameValueCollection,因为这样我们就可以控制从调用者那里实际得到的内容。
编辑:mausch是对的,因为我们应该使用通用方法,但是如果我们要序列化数据,我仍然不会使用接口。
(在此假设.NET 3.5. 在.NET 3.5之前的版本中,NameValueCollection的好处是能够将多个值绑定到一个键,而"普通"集合中没有直接等效的键。)
我们是否希望键具有多个可能的值?如果是这样,我会考虑ILookup <TKey,TValue>。否则,我会去IDictionary <TKey,TValue>。
除了别的什么,如果接收者想要进行任何使用LINQ的处理,那么任何一个通用接口都将比NameValuePair更好。同样,如果调用者已经具有通用或者动态类型的上下文,则使用LINQ可能更容易产生字典/查找。