2010-10-20 8 views
6

Estoy acostumbrado a utilizar VB.net para la programación web.Cómo establecer valores de sesión nulos predeterminados para cadenas en blanco en C#

A menudo, tengo algo como:

Dim s as string = Session("s") 

puedo obtener un valor de cadena para s de la sesión web. Si no hay ningún valor en la sesión web, obtengo una cadena en blanco.

Sin embargo, AFAIK, en C#, tengo que tener algo como el siguiente código para hacer lo mismo.

string s; 
try { s = Session["s"].ToString(); } 
catch { s = ""; } 

¿Hay alguna manera más fácil de hacerlo?

+1

En VB, obtienes Nada si intentas recuperar una variable de sesión que no existe. La mayor parte del código de recuperación de mi sesión se ve así: Dim s As String = Session ("S") If Not String.IsNullOrEmpty (s) Then DoSomethingWithS (s) End If –

Respuesta

15

Esta es una forma rápida de hacer esto:

s = (string)Session["s"] ?? ""; 

Esto fundido Sesión [ "s"] en una cadena, y si no es nulo, devuelve el valor. Si es nulo, devolverá una cadena vacía. El "a ?? b" expresión es esencialmente el mismo que "a != null ? a:b" (?? se compila de manera más eficiente sin embargo)

Otra cosa a tener en cuenta: nunca se debe utilizar excepciones para la lógica de aplicación normal.

+0

Corto, dulce. Sin funciones adicionales. Me gusta. – NotMe

+0

La siguiente sintaxis puede ser más clara: String Test = (Session ["Test"] ?? String.Empty) .ToString(); – Moo

+0

No es más limpio, pero es más seguro si Session ["Test"] no es una cadena (que creo que no es el caso aquí) –

-3

Casi estoy de acuerdo con Philippe, pero solo funciona si "s" está presente en la sesión, de lo contrario habrá una KeyNotFoundException. Este código lo verifica, pero no resuelve el problema NULL de Philippe.

s= Session.ContainsKey("s")?Session["s"]:""; 

Así que para cubrir ambas posibilidades, se hace complejo MRE:

s = Session.ContainsKey("s")?(Session["s"]??""):""; 

En realidad no hace que sea más fácil, pero el rendimiento debe ser mejor que la captura de una excepción.

+0

No creo que arroje ninguna de esas excepciones. La documentación (en http://msdn.microsoft.com/en-us/library/f0yd7k72.aspx) dice: "El valor de la colección con el nombre especificado. Si no se encuentra la clave especificada, se intenta obtenerla. nulo, e intentando establecerlo crea un nuevo elemento usando la clave especificada ". –

+0

De hecho, la sesión devolverá nulo si no se encuentra la clave. No lanzará una excepción –

+0

Sí, en la pregunta original, es la llamada .ToString() que arroja la excepción. –

0

Debido cadena es del tipo de referencia a continuación, es anulable, por lo que se puede comprobar si hay vacíos o nula por medio de String.IsNullOrEmpty (s):

string s = string.IsNullOrEmpty((string)strObject) ? string.Empty : strObject.ToString(); 

De lo contrario (como dice Philippe Leybaert) se puedo usar ?? operador.

+0

La cadena es un tipo de referencia, por lo que siempre puede contener nulos. Su código ni siquiera se compila porque 'string?' No es una sintaxis válida. –

+0

Tienes razón Philippe, la cadena es un tipo de referencia. He cambiado mi código para reflejar esa idea. – ArBR

Cuestiones relacionadas