Me encanta el operador de fusión nula porque facilita la asignación de un valor predeterminado para los tipos anulables.
int y = x ?? -1;
Eso es genial, excepto si necesito hacer algo simple con x
. Por ejemplo, si quiero verificar Session
, entonces generalmente termino teniendo que escribir algo más detallado.
Desearía poder hacer esto:
string y = Session["key"].ToString() ?? "none";
Pero no puede porque .ToString()
se llama antes de la verificación nula, por lo que falla si Session["key"]
es nulo. Termino haciendo esto:
string y = Session["key"] == null ? "none" : Session["key"].ToString();
Funciona y es mejor, en mi opinión, que la alternativa de tres líneas:
string y = "none";
if (Session["key"] != null)
y = Session["key"].ToString();
Aunque eso funciona, todavía tengo curiosidad por saber si hay una mejor manera. Parece que no importa lo que siempre tengo que hacer referencia Session["key"]
dos veces; una vez para el cheque y otra vez para la tarea. ¿Algunas ideas?
.?
) como Groovy .Respuestas:
Qué pasa
fuente
.ToStringOrDefault()
es mi forma preferida de hacerlo. Sin embargo, estoy usando esta respuesta dentro del método de extensión de Jon;)Si con frecuencia haces esto específicamente con,
ToString()
entonces podrías escribir un método de extensión:O un método que toma un valor predeterminado, por supuesto:
fuente
.ToStringOrDefault()
Es simple y elegante. Una buena soluciónobject
son una maldición y desechan una base de código, y los métodos de extensión que operan sin error enthis
valores nulos son pura maldad.También puede usar
as
, que producenull
si la conversión falla:Esto volvería
"none"
incluso si alguien metió unaint
enSession["key"]
.fuente
ToString()
en primer lugar.ToString()
para convertir un objeto que contiene una cadena en una cadena. Puedes hacer lo mismo conobj as string
o(string)obj
. Es una situación bastante común en ASP.NET.ToString()
a un objeto (es decir,Session["key"]
) cuyo tipo no mencionó. Podría ser cualquier tipo de objeto, no necesariamente una cadena.Si siempre será un
string
, puedes lanzar:Esto tiene la ventaja de quejarse en lugar de ocultar el error si alguien mete
int
algo o algoSession["key"]
. ;)fuente
Todas las soluciones sugeridas son buenas y responden la pregunta; así que esto es solo para extenderlo un poco. Actualmente, la mayoría de las respuestas solo tratan con validación nula y tipos de cadenas. Puede extender el
StateBag
objeto para incluir un genéricoGetValueOrDefault
método , similar a la respuesta publicada por Jon Skeet.Un método de extensión genérico simple que acepta una cadena como clave y luego escribe verifica el objeto de sesión. Si el objeto es nulo o no es del mismo tipo, se devuelve el valor predeterminado; de lo contrario, el valor de la sesión se devuelve fuertemente tipado.
Algo como esto
fuente
HttpSessionState
.T value = source[key] as T; return value ?? defaultValue;
HttpSessionState
la sesión. :)Usamos un método llamado
NullOr
.Uso
Fuente
fuente
Dot
pero lo encontramos muy poco descriptivo. Nos conformamos conNullOr
una buena compensación entre la autoexplicación y la brevedad. Si realmente no le importaba el nombre, siempre podría llamarlo_
. Si encuentra que las lambdas son demasiado engorrosas para escribir, puede usar un fragmento para esto, pero personalmente me parece bastante fácil. En cuanto a? :
, no puede usar eso con expresiones más complejas, tendría que moverlas a un nuevo local;NullOr
te permite evitar eso.Mi preferencia, para una sola vez, sería usar una conversión segura a cadena en caso de que el objeto almacenado con la clave no sea uno. Usar
ToString()
puede no tener los resultados que desea.Como dice @Jon Skeet, si te encuentras haciendo esto mucho como un método de extensión o, mejor aún, tal vez un método de extensión junto con una clase SessionWrapper fuertemente tipada. Incluso sin el método de extensión, el contenedor fuertemente tipado podría ser una buena idea.
Usado como
fuente
crear una función auxiliar
fuente
La respuesta de Skeet es la mejor, en particular creo que la suya
ToStringOrNull()
es bastante elegante y se adapta mejor a tus necesidades. Quería agregar una opción más a la lista de métodos de extensión:Devuelve el objeto original o el valor de cadena predeterminado para nulo :
Úselo
var
para el valor devuelto, ya que volverá como el tipo de entrada original, solo como la cadena predeterminada cuandonull
fuente
null
defaultValue
si no es necesaria (es decirinput != null
)?input != null
evaluación devolverá el objeto como sí mismo.input == null
devuelve una cadena proporcionada como parámetro. por lo tanto, es posible que una persona pueda llamar.OnNullAsString(null)
, pero el propósito (aunque rara vez es un método de extensión útil) era asegurarse de recuperar el objeto o la cadena predeterminada ... nunca nuloinput!=null
escenario solo devolverá la entrada sidefaultValue!=null
también se cumple; de lo contrario arrojará unArgumentNullException
.Este es mi pequeño tipo de "operador de Elvis" seguro para versiones de .NET que no son compatibles.
El primer argumento es el objeto probado. El segundo es la función. Y tercero es el valor nulo. Entonces para su caso:
También es muy útil para los tipos anulables. Por ejemplo:
fuente