56

どの方法が好まれますか?

Session.Remove("foo");

Session["foo"] = null;

違いはありますか?

4

5 に答える 5

123

違いはありますか?

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

于 2008-11-04T15:12:08.197 に答える
25

これが古いスレッドであることは知っていますが、間違いなく固執します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();
于 2010-11-09T11:55:53.657 に答える
11

同じ効果があります。Session.Remove個人的には、この方法の方がプログラマーの意図をよりよく表現していると思います。

MSDN のドキュメントへのリンクを次に示します。

「HttpSessionState.Item プロパティ:

プロパティ値の型: System.Object

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

于 2008-11-04T14:07:47.173 に答える
10

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

于 2008-11-04T13:48:12.953 に答える
4

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

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

また

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

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

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

于 2008-11-04T15:17:35.050 に答える