どの方法が好ましいですか?
Session.Remove("foo");
Session["foo"] = null;
違いはありますか?
違いはありますか?
有る。 Session.Remove(key)
はディクショナリからエントリ(キーと値の両方)を削除し、Session[key] = null
は値(たまたまnull)をキーに割り当てます。前の呼び出しの後、キーはSession#Keys
コレクションに表示されません。しかし、後者の後も、キーはキーコレクションにあります。
これは古いスレッドですが、間違いなく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();
Removeを使用しますが、違いがあるかどうかを正直に言うことはできません。推測では、そのnull値に対して空のキーが保持されている可能性がありますが、確実ではありません。削除は私に少しの疑いを与えます、そして、それがあなたがそれをしたいものであるならば読みやすいコードでも。
同じ効果があります。個人的にはSession.Remove
メソッドは、プログラマの意図をよりよく表現します。
ここに、MSDNのドキュメントへのリンクがいくつかあります。
"HttpSessionState.Itemプロパティ:
プロパティ値タイプ:System.Object
指定された名前のセッション状態値、またはアイテムが存在しない場合はnull参照(Visual BasicではNothing)。 "
最大の違いは、セッションから読み取る方法です。
if(Session.ContainsKey["foo"]) { return Session["foo"]; }
または
if(Session["foo"] != null) { return Session["foo"]; }
最初の方法を使用する場合、値をnullに設定しても機能しないため、removeを使用する必要があります。
2番目の方法を使用する場合、値をnullに設定できます。