.NET的 HttpSessionState 使用“ InProc ”存储似乎将会话变量键值视为不区分大小写。例如:
session["foo"] = 1;
session["Foo"] = 2;
Trace.Write(session["foo"].ToString()); // => 2
这种行为似乎没有记录,所以我想知道它是否仅仅是底层会话存储机制的副作用,还是故意由类本身实现的。 由于C#将其他所有内容视为区分大小写,因此会话以不同的方式行事会有点令人不安。是什么赋予了?商店类型有所不同吗?它是否与VB向后兼容?
答案 0 :(得分:34)
HttpSessionState的键不区分大小写,以匹配传统ASP Session对象的行为。这使得开发人员可以更轻松地将ASP应用程序移植到ASP.NET,而不会引入细微的区分大小写问题。
QueryString,Cookies等对象和其他类似于Classic-ASP的内置对象也存在相同的不区分大小写的行为。
在设计ASP.NET时,我在Microsoft的IIS团队工作,并且ASP.NET努力使ASP.NET代码尽可能向后兼容ASP。这并不意味着ASP.NET具有完美的向后兼容性,但无论何时出现决策(如此区分大小写),默认答案是匹配经典ASP行为,除非有充分的理由不这样做。
尽管如此,我同意Session的案例不敏感性可以更好地记录下来。
BTW,ASP.NET Session集合从NameObjectCollectionBase获取其案例行为,{{3}}是Cookie,会话状态,应用程序状态,标题等所有ASP.NET内置对象的基类。文档:此基础结构 class是一个哈希表。
每个元素都是键/值对。
一个人的能力 NameObjectCollectionBase是数字 元素的 NameObjectCollectionBase可以容纳。如 元素被添加到a NameObjectCollectionBase,容量 根据需要自动增加 通过重新分配。
哈希码提供程序分配哈希值 密钥的代码 NameObjectCollectionBase实例。该 默认的哈希码提供者是 CaseInsensitiveHashCodeProvider。
比较器确定是否两个 钥匙是平等的。默认比较器 是CaseInsensitiveComparer。
在.NET Framework 1.0版中,这个 class使用区分文化的字符串 比较。但是,在.NET中 框架版本1.1及更高版本,这个 课堂使用 CultureInfo .. ::。InvariantCulture时 比较字符串。更多 有关文化如何影响的信息 比较和排序,请参阅比较 和特定的数据排序 文化比较与排序数据 特定文化与表演 文化不敏感的字符串操作。
一个合理的后续问题是:为什么经典ASP使用不区分大小写的键设计?原因是,早在1996年(或其左右),ASP使用的主要语言是VBScript,因此有必要迎合VB开发人员对案例不敏感的期望。
答案 1 :(得分:0)
虽然C#区分大小写,但ASP.NET中的这些构造不区分大小写,因为HTML中的大部分内容不区分大小写(至少在HTML4中 - XHTML区分大小写,或者当然)。我相信这是在课堂上实现的。它与国家是处于进程中还是其他地方无关。