Quelle est la meilleure façon de déterminer qu’une variable de session est nulle ou vide en C #?

Quel est le meilleur moyen de vérifier l’existence d’une variable de session dans ASP.NET C #?

J’aime utiliser Ssortingng.IsNullOrEmpty fonctionne pour les chaînes et je me demandais s’il existait une méthode similaire pour Session . Actuellement, le seul moyen que je connaisse est:

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

Suivre ce que d’autres ont dit. J’ai tendance à avoir deux couches:

La couche centrale Cela se trouve dans une DLL qui est ajoutée à presque tous les projets d’applications Web . En cela, j’ai un cours SessionVars qui fait le travail de grunt pour les getters / setters de l’état de la session. Il contient du code comme celui-ci:

 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(ssortingng key) { if (Session[key] == null) return default(T); else return (T)Session[key]; } public static void Set(ssortingng key, T value) { Session[key] = value; } } 

Notez les génériques pour obtenir n’importe quel type.

J’ajoute ensuite des Getters / Setters pour des types spécifiques, en particulier la chaîne car je préfère souvent travailler avec ssortingng.Empty plutôt que null pour les variables présentées aux utilisateurs.

par exemple:

 public static ssortingng GetSsortingng(ssortingng key) { ssortingng s = Get(key); return s == null ? ssortingng.Empty : s; } public static void SetSsortingng(ssortingng key, ssortingng value) { Set(key, value); } 

Etc…

Je crée ensuite des wrappers pour les séparer et les append au modèle d’application. Par exemple, si nous avons des détails sur le client:

 public class CustomerInfo { public ssortingng Name { get { return SessionVar.GetSsortingng("CustomerInfo_Name"); } set { SessionVar.SetSsortingng("CustomerInfo_Name", value); } } } 

Vous avez l’idée juste? 🙂

REMARQUE: Vous avez juste pensé à append un commentaire à la réponse acceptée. Assurez-vous toujours que les objects sont sérialisables lors de leur stockage dans Session lors de l’utilisation d’un serveur d’état. Il peut être trop facile d’essayer de sauvegarder un object en utilisant les génériques sur la ferme Web et de le faire exploser. Je déploie sur une batterie de serveurs Web au travail, donc j’ai ajouté des vérifications à mon code dans la couche principale pour voir si l’object est sérialisable, un autre avantage de l’encapsulation des objects GETTER et Setters 🙂

C’est à peu près ce que vous faites. Cependant, vous pouvez utiliser une syntaxe plus courte.

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

Cela signifie que si les variables de session sont nulles, définissez sSession sur “set this”

Cela peut rendre les choses plus élégantes pour les envelopper dans une propriété.

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

alors vous pouvez le traiter comme une chaîne.

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

La notation ‘as’ dans c # 3.0 est très propre. Étant donné que toutes les variables de session sont des objects nullables, cela vous permet de saisir la valeur et de la placer dans votre propre variable saisie sans avoir à lancer une exception. La plupart des objects peuvent être manipulés de cette manière.

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

Mon concept est que vous devez tirer vos variables de session dans des variables locales, puis les gérer de manière appropriée. Supposez toujours que vos variables de session peuvent être nulles et ne jamais les convertir en un type non nullable.

Si vous avez besoin d’une variable typée non nullable, vous pouvez alors utiliser TryParse pour l’obtenir.

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

À mon avis, la manière la plus simple de le faire est claire et facile à lire:

  Ssortingng sVar = (ssortingng)(Session["SessionVariable"] ?? "Default Value"); 

Ce n’est peut-être pas la méthode la plus efficace, car elle jette la valeur de chaîne par défaut même dans le cas de la valeur par défaut (conversion d’une chaîne en chaîne), mais si vous en faites une pratique de codage standard, et est facilement lisible.

Par exemple (un exemple totalement faux, mais il montre le point):

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

J’aime l’option Generics, mais il semble exagéré à moins que vous ne souhaitiez en avoir besoin partout. La méthode des extensions pourrait être modifiée pour étendre spécifiquement l’object Session de sorte qu’il ait une option get “sûre” telle que Session.SsortingngIfNull (“SessionVar”) et Session [“SessionVar”] = “myval”; Il brise la simplicité de l’access à la variable via Session [“SessionVar”], mais c’est du code propre, et permet toujours de valider si null ou si chaîne si vous en avez besoin.

Ne rien vérifier / Null est le moyen de le faire.

Gérer les types d’object n’est pas la solution. Déclarez un type ssortingct et essayez de convertir l’object au type correct. (Et utiliser l’indice de conversion ou Convertir)

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

Désolé pour toute violation de la syntaxe, je suis un VB’er quotidien

Généralement, je crée SessionProxy avec des propriétés fortement typées pour les éléments de la session. Le code qui accède à ces propriétés vérifie la nullité et effectue le transtypage au type approprié. La bonne chose à ce sujet est que tous les éléments liés à ma session sont conservés au même endroit. Je n’ai pas à me soucier d’utiliser différentes clés dans différentes parties du code (et de me demander pourquoi cela ne fonctionne pas). Et avec l’dependency injection et la moquerie, je peux le tester complètement avec des tests unitaires. If suit les principes DRY et me permet également de définir des valeurs par défaut raisonnables.

 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 ssortingng UserLastName { get { return (ssortingng)this.session["UserLastName"]; } set { this.session["UserLastName"] = value; } } } 

J’aime aussi envelopper les variables de session dans les propriétés. Les parameters ici sont sortingviaux, mais j’aime bien écrire les méthodes get pour qu’ils n’aient qu’un seul sharepoint sortie. Pour ce faire, je vérifie généralement la valeur null et la définit par défaut avant de renvoyer la valeur de la variable de session. Quelque chose comme ça:

 ssortingng Name { get { if(Session["Name"] == Null) Session["Name"] = "Default value"; return (ssortingng)Session["Name"]; } set { Session["Name"] = value; } } 

}

Cette méthode ne suppose pas non plus que l’object dans la variable Session est une chaîne

 if((Session["MySessionVariable"] ?? "").ToSsortingng() != "") //More code for the Code God 

Donc, fondamentalement, remplace la variable null par une chaîne vide avant de la convertir en chaîne, car ToSsortingng fait partie de la classe Object

Si vous savez que c’est une chaîne, vous pouvez utiliser la fonction Ssortingng.IsEmptyOrNull ().

Utilisez-vous .NET 3.5? Créez une méthode d’extension IsNull:

 public static bool IsNull(this object input) { input == null ? return true : return false; } public void Main() { object x = new object(); if(x.IsNull) { //do your thing } }