web-dev-qa-db-ja.com

ASP.NETがセッションからアイテムを削除しますか?

どの方法が好ましいですか?

Session.Remove("foo");

Session["foo"] = null;

違いはありますか?

55
David Basarab

違いはありますか?

有る。 Session.Remove(key)はディクショナリからエントリ(キーと値の両方)を削除し、Session[key] = nullは値(たまたまnull)をキーに割り当てます。前の呼び出しの後、キーはSession#Keysコレクションに表示されません。しかし、後者の後も、キーはキーコレクションにあります。

120
Buu Nguyen

これは古いスレッドですが、間違いなくSession["key"] = null-はるかに高速です! InProc Session Stateでいくつかのテストを行って、行の1000アイテムを削除しました(経過時間は合計1000アイテムです。したがって、1つのアイテムの平均時間が必要な場合は、1000で割ってください)。

1000個の既存のアイテムを削除する:

Session[key] = null; - 0.82380000000000009 ms
Session.Remove(key); - 59.960100000000004 ms

既存のアイテムではなく1000個を削除する:

Session[key] = null; - 1.5368000000000002 ms
Session.Remove(key); - 0.6621 ms

500個の既存のアイテムと500個の既存ではないアイテムの削除:

Session[key] = null; - 1.0432000000000001 ms
Session.Remove(key); - 33.9502 ms

最初のテストのコードは次のとおりです。

Session.Clear();

for (int i = 0; i < 1000; i++)
    Session[i.ToString()] = new object();

Stopwatch sw1 = Stopwatch.StartNew();
for (int i = 0; i < 1000; i++)
    Session[i.ToString()] = null;
sw1.Stop();

Session.Clear();

for (int i = 0; i < 1000; i++)
    Session[i.ToString()] = new object();

Stopwatch sw2 = Stopwatch.StartNew();
for (int i = 0; i < 1000; i++)
    Session.Remove(i.ToString());
sw2.Stop();
26
JakubRi

Removeを使用しますが、違いがあるかどうかを正直に言うことはできません。推測では、そのnull値に対して空のキーが保持されている可能性がありますが、確実ではありません。削除は私に少しの疑いを与えます、そして、それがあなたがそれをしたいものであるならば読みやすいコードでも。

10
dove

同じ効果があります。個人的にはSession.Removeメソッドは、プログラマの意図をよりよく表現します。

ここに、MSDNのドキュメントへのリンクがいくつかあります。

"HttpSessionState.Itemプロパティ:

プロパティ値タイプ:System.Object

指定された名前のセッション状態値、またはアイテムが存在しない場合はnull参照(Visual BasicではNothing)。 "

9
splattne

最大の違いは、セッションから読み取る方法です。

if(Session.ContainsKey["foo"]) { return Session["foo"]; }

または

if(Session["foo"] != null) { return Session["foo"]; }

最初の方法を使用する場合、値をnullに設定しても機能しないため、removeを使用する必要があります。

2番目の方法を使用する場合、値をnullに設定できます。

4
FlySwat