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是一个固定的实现,因此它取决于您希望对上下文执行的操作。请注意,关于这一点还有其他几个问题,并进行了有趣的讨论。