21

「 InProc 」ストアを使用する.NETのHttpSessionStateは、セッション変数のキー値を大文字と小文字を区別しないものとして扱うようです。例えば:

session["foo"] = 1;
session["Foo"] = 2;
Trace.Write(session["foo"].ToString()); // => 2

この動作は文書化されていないように見えるので、それが単に基礎となるセッションストアメカニズムの副作用なのか、それともクラス自体によって意図的に実装されたものなのか疑問に思います。C#は他のすべてを大文字と小文字を区別して扱うため、セッションが同じように動作しないのは少し不安です。何が得られますか?店舗の種類によって違いますか?VBとの下位互換性のためにありますか?

4

2 に答える 2

35

HttpSessionStateのキーは、従来のASPセッションオブジェクトの動作と一致するように大文字と小文字を区別しないように作成されました。これにより、開発者は、大文字と小文字を区別する微妙な問題を発生させることなく、ASPアプリケーションをASP.NETに簡単に移植できます。

同じ大文字と小文字を区別しないキーの動作は、QueryString、Cookieなどのオブジェクト、およびその他のClassic-ASP組み込みオブジェクトにも当てはまります。

ASP.NETが設計されていたとき、私はMicrosoftのIISチームに所属していましたが、ASP.NETは、可能な限りASP.NETコードとASPの下位互換性を維持するために懸命に働きました。これは、ASP.NETに完全な逆互換性があることを意味するわけではありませんが、決定が下されたときはいつでも(この大文字と小文字を区別するもののように)、デフォルトの答えは、正当な理由がない限り、クラシックASPの動作と一致することでした。

そうは言っても、Sessionの大文字と小文字を区別しないことをより適切に文書化できることに同意します。

ところで、ASP.NETセッションコレクションは、Cookie、セッション状態、アプリケーション状態、ヘッダーなどのすべてのASP.NET組み込みオブジェクトの基本クラスであるNameObjectCollectionBaseからケースの動作を取得します。ドキュメントから:

このクラスの基礎となる構造はハッシュテーブルです。

各要素はキーと値のペアです。

NameObjectCollectionBaseの容量は、NameObjectCollectionBaseが保持できる要素の数です。NameObjectCollectionBaseに要素が追加されると、再割り当てによって必要に応じて容量が自動的に増加します。

ハッシュコードプロバイダーは、NameObjectCollectionBaseインスタンスのキーのハッシュコードをディスペンスします。デフォルトのハッシュコードプロバイダーはCaseInsensitiveHashCodeProviderです。

比較者は、2つのキーが等しいかどうかを判断します。デフォルトの比較対象はCaseInsensitiveComparerです。

.NET Frameworkバージョン1.0では、このクラスはカルチャに依存する文字列比較を使用します。ただし、.NET Frameworkバージョン1.1以降では、このクラスは文字列を比較するときにCultureInfo..::。InvariantCultureを使用します。カルチャが比較とソートにどのように影響するかについての詳細は、特定のカルチャのデータの比較とソートおよび特定のカルチャのデータの比較とソートおよびカルチャに依存しない文字列操作の実行を参照してください。

妥当なフォローアップの質問は次のとおりです。従来のASPで大文字と小文字を区別しないキーを使用して設計されたのはなぜですか。この理由は、1996年(またはその前後)にASPで使用された主な言語がVBScriptであったため、VB開発者の大文字と小文字を区別しない期待に応えることが理にかなっているためです。

于 2009-11-13T19:59:50.727 に答える
0

C#は大文字と小文字を区別しますが、ASP.NETのこれらの構造は大文字と小文字を区別しません。これは、HTMLの多くが大文字と小文字を区別しないためです(少なくともHTML4では、XHTMLは大文字と小文字を区別します)。これはクラス自体に実装されていると思います。状態が進行中か他の場所かには関係ありません。

于 2009-11-13T19:48:28.410 に答える