C# IDictionary<;字符串,字符串>;或NameValueCollection

C# IDictionary<;字符串,字符串>;或NameValueCollection,c#,C#,我目前正在编写一个接口,以允许应用程序将异常数据发送到中央存储库以获得支持。我对如何传递额外的上下文数据感到困惑: public interface IExceptionNotifier { void Notify(Exception ex, NameValueCollection context); //this void Notify(Exception ex, IDictionary<string, string> context); //or th

我目前正在编写一个接口,以允许应用程序将异常数据发送到中央存储库以获得支持。我对如何传递额外的上下文数据感到困惑:

public interface IExceptionNotifier
{
    void Notify(Exception ex, NameValueCollection context); //this      
    void Notify(Exception ex, IDictionary<string, string> context); //or this
}
公共接口IEExceptionNotifier
{
void Notify(异常示例,NameValueCollection上下文);//此
void Notify(异常示例,IDictionary上下文);//或此
}

我经常发现自己在创建查找时也处于类似的位置。忽略异常通知程序概念是否良好,最好使用
IDictionary
还是
NameValueCollection
?为什么要选择一个而不是另一个呢?

如果上下文是一个一次性值,并且(这里是重要的部分)不会被序列化,例如,为了将数据发送到另一个系统,我会选择IDictionary,因为它使界面的使用更加灵活

另一方面,如果上下文一直保持不变,或者上下文将被序列化,请使用NameValueCollection,因为这样您就可以控制从调用方实际获得的内容

编辑:mausch的观点是正确的,您应该使用一种通用方法,但如果您想序列化数据,我仍然不会使用接口。

(假设这里是.NET 3.5。在.NET 3.5之前,NameValueCollection的优点是能够将多个值绑定到一个键,而在“正常”集合中没有直接等价物。)

是否希望键具有潜在的多个值?如果是这样,我会考虑ILOOKUP。否则,我会选择IDictionary


除此之外,如果接收方希望在LINQ对其有用的情况下进行任何处理,那么两个通用接口中的任何一个都将比NameValuePair更好。同样,如果调用者已经拥有一种通用或动态的上下文,那么使用LINQ生成字典/查找可能会更容易。

您能否展开“在控制您从调用者那里实际获得的内容”的讨论?呼叫方发送重复密钥的可能性是问题所在吗?我想我不太明白,如果涉及序列化,为什么要避免使用字典。@JeffBridgman:这差不多是十年前的事了,我真的不记得我的意思了;)我想这是关于获取特定类的对象(即具有某些约束,如序列化支持),或者获取具有特定接口的任何内容。例如,IDictionary实现可能只是不支持序列化或某些方法,而NameValueCollection是一个固定的实现,因此它取决于您希望对上下文执行的操作。请注意,关于这一点还有其他几个问题,并进行了有趣的讨论。