[c#] C #에서 세션 변수가 null인지 비어 있는지 확인하는 가장 좋은 방법은 무엇입니까?

ASP.NET C #에서 세션 변수의 존재를 확인하는 가장 좋은 방법은 무엇입니까?

나는 String.IsNullOrEmpty()문자열에 작품 을 사용하는 것을 좋아하고 Session. 현재 내가 아는 유일한 방법은 다음과 같습니다.

 var session;
 if (Session["variable"] != null)
 {
     session = Session["variable"].ToString();
 }
 else
 {
     session = "set this";
     Session["variable"] = session;
 }



답변

다른 사람들이 말한 것을 따르십시오. 나는 두 개의 레이어를 갖는 경향이 있습니다.

핵심 계층. 이것은 거의 모든 웹 앱 프로젝트에 추가되는 DLL 내에 있습니다 . 여기에는 세션 상태 게터 / 세터에 대한 지저분한 작업을 수행하는 SessionVars 클래스가 있습니다. 다음과 같은 코드가 포함되어 있습니다.

public class SessionVar
{
    static HttpSessionState Session
    {
        get
        {
            if (HttpContext.Current == null)
                throw new ApplicationException("No Http Context, No Session to Get!");

            return HttpContext.Current.Session;
        }
    }

    public static T Get<T>(string key)
    {
        if (Session[key] == null)
            return default(T);
        else
            return (T)Session[key];
    }

    public static void Set<T>(string key, T value)
    {
        Session[key] = value;
    }
}

모든 유형을 얻기위한 제네릭에 유의하십시오.

그런 다음 특정 유형, 특히 문자열에 대해 Getters / Setters를 추가합니다. 사용자에게 제공되는 변수에 대해 null이 아닌 string.Empty로 작업하는 것을 선호하기 때문입니다.

예 :

public static string GetString(string key)
{
    string s = Get<string>(key);
    return s == null ? string.Empty : s;
}

public static void SetString(string key, string value)
{
    Set<string>(key, value);
}

등등…

그런 다음 래퍼를 만들어이를 추상화하고 응용 프로그램 모델로 가져옵니다. 예를 들어 고객 세부 정보가있는 경우 :

public class CustomerInfo
{
    public string Name
    {
        get
        {
            return SessionVar.GetString("CustomerInfo_Name");
        }
        set
        {
            SessionVar.SetString("CustomerInfo_Name", value);
        }
    }
}

아이디어가 맞습니까? 🙂

참고 : 수락 된 답변에 댓글을 추가 할 때 생각을했습니다. 상태 서버를 사용할 때 세션에 객체를 저장할 때 항상 객체를 직렬화 할 수 있는지 확인하십시오. 웹 팜에있을 때 제네릭을 사용하여 개체를 저장하고 저장하는 것은 너무나 쉬울 수 있습니다. 저는 직장에서 웹 팜에 배포하므로 코어 계층의 코드에 개체가 직렬화 가능한지 확인하기 위해 검사를 추가했습니다. 세션 게터 및 세터를 캡슐화하는 또 다른 이점입니다.


답변

그것이 당신이하는 방법입니다. 그러나 사용할 수있는 더 짧은 구문이 있습니다.

sSession = (string)Session["variable"] ?? "set this";

이것은 세션 변수가 null이면 sSession을 “set this”로 설정하는 것입니다.


답변

속성으로 감싸는 것이 더 우아하게 만들 수 있습니다.

string MySessionVar
{
   get{
      return Session["MySessionVar"] ?? String.Empty;
   }
   set{
      Session["MySessionVar"] = value;
   }
}

그런 다음 문자열로 처리 할 수 ​​있습니다.

if( String.IsNullOrEmpty( MySessionVar ) )
{
   // do something
}


답변

C # 3.0의 ‘as’표기법은 매우 깨끗합니다. 모든 세션 변수는 nullable 객체이기 때문에 예외가 발생할 염려없이 값을 가져 와서 자신의 유형이 지정된 변수에 넣을 수 있습니다. 대부분의 개체는 이러한 방식으로 처리 할 수 ​​있습니다.

string mySessionVar = Session["mySessionVar"] as string;

내 개념은 세션 변수를 로컬 변수로 가져온 다음 적절하게 처리해야한다는 것입니다. 항상 세션 변수가 null 일 수 있다고 가정하고 nullable이 아닌 유형으로 캐스트하지 마십시오.

nullable 유형이 아닌 변수가 필요한 경우 TryParse를 사용하여 가져올 수 있습니다.

int mySessionInt;
if (!int.TryParse(mySessionVar, out mySessionInt)){
   // handle the case where your session variable did not parse into the expected type 
   // e.g. mySessionInt = 0;
}


답변

제 생각에는 명확하고 읽기 쉬운이 작업을 수행하는 가장 쉬운 방법은 다음과 같습니다.

 String sVar = (string)(Session["SessionVariable"] ?? "Default Value");

기본값 (문자열을 문자열로 캐스팅)의 경우에도 기본 문자열 값을 캐스팅하기 때문에 가장 효율적인 방법이 아닐 수 있지만 표준 코딩 방법으로 만들면 모든 데이터 유형에 대해 작동합니다. 쉽게 읽을 수 있습니다.

예를 들어 (완전히 가짜의 예이지만 요점을 보여줍니다) :

 DateTime sDateVar = (datetime)(Session["DateValue"] ?? "2010-01-01");
 Int NextYear = sDateVar.Year + 1;
 String Message = "The Procrastinators Club will open it's doors Jan. 1st, " +
                  (string)(Session["OpeningDate"] ?? NextYear);

나는 Generics 옵션을 좋아하지만 모든 곳에서 이것을 필요로하지 않는 한 과잉처럼 보입니다. 확장 메서드는 Session.StringIfNull ( “SessionVar”) 및 Session [ “SessionVar”] = “myval”과 같은 “안전한”가져 오기 옵션을 갖도록 Session 개체를 특별히 확장하도록 수정할 수 있습니다. 이것은 Session [ “SessionVar”]를 통해 변수에 접근하는 단순성을 깨뜨리지 만, 깨끗한 코드이며, 필요한 경우 null 또는 string 인 경우 유효성 검사를 허용합니다.


답변

아무것도 / Null을 확인하는 것이이를 수행하는 방법입니다.

객체 유형을 다루는 것은 갈 길이 아닙니다. 엄격한 유형을 선언하고 개체를 올바른 유형으로 캐스팅 해보십시오. (그리고 캐스트 힌트 또는 변환 사용)

 private const string SESSION_VAR = "myString";
 string sSession;
 if (Session[SESSION_VAR] != null)
 {
     sSession = (string)Session[SESSION_VAR];
 }
 else
 {
     sSession = "set this";
     Session[SESSION_VAR] = sSession;
 }

구문 위반에 대해 죄송합니다. 저는 매일 VB’er입니다.


답변

일반적으로 세션의 항목에 대해 강력한 형식의 속성을 사용하여 SessionProxy를 만듭니다. 이러한 속성에 액세스하는 코드는 nullity를 확인하고 적절한 유형으로 캐스팅합니다. 이것의 좋은 점은 모든 세션 관련 항목이 한곳에 보관된다는 것입니다. 코드의 다른 부분에서 다른 키를 사용하는 것에 대해 걱정할 필요가 없습니다 (그리고 왜 작동하지 않는지 궁금합니다). 그리고 의존성 주입과 조롱을 통해 단위 테스트로 완벽하게 테스트 할 수 있습니다. DRY 원칙을 따르고 합리적인 기본값을 정의 할 수도 있습니다.

public class SessionProxy
{
    private HttpSessionState session; // use dependency injection for testability
    public SessionProxy( HttpSessionState session )
    {
       this.session = session;  //might need to throw an exception here if session is null
    }

    public DateTime LastUpdate
    {
       get { return this.session["LastUpdate"] != null
                         ? (DateTime)this.session["LastUpdate"]
                         : DateTime.MinValue; }
       set { this.session["LastUpdate"] = value; }
    }

    public string UserLastName
    {
       get { return (string)this.session["UserLastName"]; }
       set { this.session["UserLastName"] = value; }
    }
}