为什么 HttpSessionState 没有实现 IDictionary 接口?

6

HttpSessionState 看起来像是一个典型的键值对集合,那为什么它没有实现IDictionary 接口呢?

背景:当 ASP.NET 网站出现错误时,我尝试输出/保存其上下文,并希望使用递归函数来输出包含的所有集合。由于 HttpSessionState 只实现了 ICollectionIEnumerable 接口,如果我想以通用方式工作(即使用接口),就会丢失关于键的信息。

3个回答

8

IDictionary 接口意味着目标集合能够通过键进行快速查找。(就我所知) HttpSessionState 仅是一个项的列表,而不是字典样式结构。由于对该结构的搜索需要线性时间,因此没有理由将其视为字典。如果您需要大量快速查找,那么请将键和值复制到真正的字典中。如果您不需要快速查找,则只需专门针对该类。

接口中有许多内容,不仅仅是方法原型的列表。还有语义需要保留在接口中。通过键进行快速查找是 (大多数) 消费者对任何IDictionary 的一种非显式假设。


2
如何编写自己的IDictionary实现包装器,以接收HttpSessionState对象作为其构造函数的参数,并按照您的要求运行?我假设您想这样做是为了能够替换其他种类的名称-值(IDictionary实现)会话实现。
当然,正如Billy所指出的那样,这是将性能较差的伪字典穿上字典外衣的好方法!

-1
只需循环遍历会话密钥并像这样引用值即可:
Session[key]

嘿,谢谢你的回答。不过它并没有回答我的问题。我仍然无法编写一个通用的函数来处理其他情况/集合的输出。我必须将其转换为HttpSessionState才能使其工作。 - magnattic
而且它仍然没有解释为什么.NET团队选择不在这里使用接口。我很好奇。 ;) - magnattic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接