HttpSessionState 的键不区分大小写以匹配经典 ASP 会话对象的行为。这使开发人员可以更轻松地将其 ASP 应用程序移植到 ASP.NET,而不会引入细微的区分大小写问题。
QueryString、Cookies 等对象和其他类似于 Classic-ASP 内置对象的相同的不区分大小写键的行为也是如此。
在设计 ASP.NET 时,我在 Microsoft 的 IIS 团队工作,ASP.NET 努力使 ASP.NET 代码尽可能向后兼容 ASP。这并不意味着 ASP.NET 具有完美的向后兼容性,但每当做出决定时(例如这种区分大小写的决定),默认答案是匹配经典 ASP 行为,除非有充分的理由不这样做。
也就是说,我同意可以更好地记录 Session 的不区分大小写。
顺便说一句,ASP.NET 会话集合从NameObjectCollectionBase获取其案例行为,NameObjectCollectionBase是所有 ASP.NET 内置对象的基类,用于 Cookie、会话状态、应用程序状态、标头等。来自文档:
这个类的底层结构是一个哈希表。
每个元素都是一个键/值对。
NameObjectCollectionBase 的容量是 NameObjectCollectionBase 可以容纳的元素数。随着元素被添加到 NameObjectCollectionBase,容量会根据需要通过重新分配自动增加。
哈希码提供程序为 NameObjectCollectionBase 实例中的键分配哈希码。默认哈希码提供程序是 CaseInsensitiveHashCodeProvider。
比较器确定两个键是否相等。默认比较器是 CaseInsensitiveComparer。
在 .NET Framework 1.0 版中,此类使用区分区域性的字符串比较。但是,在 .NET Framework 1.1 版及更高版本中,此类在比较字符串时使用 CultureInfo..::.InvariantCulture。有关区域性如何影响比较和排序的详细信息,请参阅比较和排序特定区域性的数据、比较和排序特定区域性的数据和执行不区分区域性的字符串操作。
一个合理的后续问题是:为什么经典的 ASP 设计有不区分大小写的键?这样做的原因是,早在 1996 年(或前后),与 ASP 一起使用的主要语言是 VBScript,因此迎合 VB 开发人员不区分大小写的期望是有意义的。