9

する代わりに

 session("myvar1") = something
 session("myvar2") = something
 session("myvar3") = something
 session("myvar4") = something

やっている

enum sessionVar
   myvar1
   myvar2
   myvar3
   myvar4
end enum


 session(sessionVar.myvar1.tostring) = something
 session(sessionVar.myvar2.tostring) = something
 session(sessionVar.myvar3.tostring) = something
 session(sessionVar.myvar4.tostring) = something

のほうがいい?

4

7 に答える 7

17

セッションキーに定数を使用する代わりに、次のような独自のタイプセーフセッションオブジェクトを使用しています(申し訳ありませんが、これはC#です。VBバージョンについては以下を参照してください)。

public class MySession
{
  // Private constructor (use MySession.Current to access the current instance).
  private MySession() {}

  // Gets the current session.
  public static MySession Current
  {
    get
    {
      MySession session = HttpContext.Current.Session["__MySession__"] as MySession;
      if (session == null)
      {
        session = new MySession();
        HttpContext.Current.Session["__MySession__"] = session;
      }
      return session;
    }
  }

  // My session data goes here:
  public string MyString { get; set; };
  public bool MyFlag { get; set; };
  public int MyNumber { get; set; };
}

セッションとの間で何かを読み書きする必要があるときはいつでも、次のようにタイプセーフセッションオブジェクトを使用できます。

string s = MySession.Current.MyString;
s = "new value";
MySession.Current.MyString = s;

このソリューションには、いくつかの利点があります。

  • タイプセーフセッションがあります(タイプキャストはもうありません)
  • すべてのセッションベースのデータを文書化できます(MySessionのパブリックプロパティにコメントすることで)
  • セッションに新しい要素を追加するときに、同じセッションキーが別の場所ですでに使用されているかどうかを確認するためにソリューションを検索する必要はありません。

更新: これがVBバージョンです(C#バージョンから自動的に変換されます)。申し訳ありませんが、VBがわからないため、VBでプロパティを作成する方法がわかりませんでした。

Public Class MySession
    ' Private constructor (use MySession.Current to access the current instance).
    Private Sub New()
    End Sub

    ' Gets the current session.
    Public Shared ReadOnly Property Current() As MySession
        Get
            Dim session As MySession = TryCast(HttpContext.Current.Session("__MySession__"), MySession)
            If session = Nothing Then
                session = New MySession()
                HttpContext.Current.Session("__MySession__") = session
            End If
            Return session
        End Get
    End Property

    ' My session data goes here:
    Public MyString As String
    Public MyFlag As Boolean
    Public MyNumber As Integer
End Class
于 2009-01-21T14:46:00.750 に答える
9

それらの値が関連している場合のみ。それ以外の場合は、単純な古い定数を使用してください。

于 2009-01-21T14:32:50.887 に答える
4

どうですか:-

public static class  SessionVar
{
  public static readonly string myVar1 = "myVar1";
  public static readonly string myVar2 = "myVar2";
  public static readonly string myVar3 = "myVar3";
  public static readonly string myVar4 = "myVar4";
}

これにより、以下を使用できます。-

session(SessionVar.myVar1) = something;
于 2009-01-21T14:42:21.520 に答える
0

すべての文字列キー参照を削除する簡単な方法として、アプリケーションスコープに表示されるグローバル静的/共有定数を使用します。

それ以外の場合は、セッション変数の強く型付けされた単純なラッパーが優れた代替手段であり、インテリセンスとオブジェクトブラウザーの互換性が得られることを考えると、はるかにOOPに適しています。

列挙型が非常に価値があることを確認できる唯一の方法は、配列または同様のリストにインデックスを付けるために使用することです。ただし、それでも列挙型をintにキャストする必要があります。

したがって、アプリケーションの起動時にすべてのセッション変数キーとインデックスの列挙型を使用してロードする配列を作成できます。ただし、SessionオブジェクトがIEnumerableから派生するHttpSessionStateから派生している場合、必要に応じて、セッション変数に対してforeachループを実行できるはずです。

于 2009-01-21T14:47:30.403 に答える
0

このようなクラスを使用して、型付きセッション/キャッシュラッパーを作成しました。get / setにコードを追加する必要があるかもしれませんが、それはあなたに任せます。

internal class SessionHelper
{
    private const string  myVar1Key = "myvar1";

    public static int MyVar1
    {
        get
        {
            return (int)System.Web.HttpContext.Current.Session[myVar1Key];
        }
        set
        {
            System.Web.HttpContext.Current.Session[myVar1Key] = value;
        }
    }
}

C#について申し訳ありません...

于 2009-01-21T14:47:58.810 に答える
0

この質問は少し前に出されたもので、「答え」はすでに選ばれています。しかし、私はちょうどそれに出くわしました。マーティンの答えは良いです。ただし、将来これに出くわした人を支援するために、Session をうまく処理する方法が本当に必要な場合は、この投稿をお読みください。これ以上簡単なことはないと思います。

于 2010-01-14T00:39:34.777 に答える