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