¿Existe una forma sencilla de hacer lo siguiente?
String s = myObj == null ? "" : myObj.ToString();
Sé que puedo hacer lo siguiente, pero realmente lo considero un truco:
String s = "" + myObj;
Sería genial si Convert.ToString () tuviera una sobrecarga adecuada para esto.
Convert.ToString()
hace exactamente lo primero que escribiste debajo.Respuestas:
C # 6.0 Editar:
Con C # 6.0 ahora podemos tener una versión sucinta y sin cast del método original:
O incluso usando interpolación:
Respuesta original:
o
para ser aún más conciso.
Desafortunadamente, como se ha señalado, a menudo necesitará un molde en ambos lados para que esto funcione con tipos que no sean String u Object:
Por lo tanto, si bien puede parecer elegante, el elenco casi siempre es necesario y no es tan sucinto en la práctica.
Como se sugirió en otra parte, recomiendo tal vez usar un método de extensión para hacer este limpiador:
fuente
string.Format formateará nulo como una cadena vacía y llamará a ToString () en objetos no nulos. Según tengo entendido, esto es lo que estabas buscando.
fuente
"" + myObj
. Pero he leído que crea cadenas adicionales.str.Concat(myObj)
parece funcionar bien y es "incluso más rápido".Ha habido un
Convert.ToString(Object value)
.Net 2.0 desde entonces (aproximadamente 5 años antes de que se preguntara esta Q), que parece hacer exactamente lo que quieres:http://msdn.microsoft.com/en-us/library/astxcyeh(v=vs.80).aspx
¿Me estoy perdiendo / malinterpretando algo realmente obvio aquí?
fuente
Con un método de extensión, puede lograr esto:
Lo siguiente no escribiría nada en la pantalla y no generaría una excepción:
fuente
string s = "" + myObj;
es un truco, llamar a una función en un objeto nulo debería caer en ese mismo barco. Yo rechazaría esto, pero resuelve el problema en cuestión, simplemente no estoy de acuerdo con el uso. Los objetos nulos deben lanzarNullReferenceException
, incluso en métodos de extensión.ToStringOrEmptyWhenNull
.this
parámetro) porque son simplemente azúcar sintáctico. Es decirx.SomeExtensionMethod()
es el azúcar sintáctica paraSomeStaticClass.SomeExtensionMethod(x);
tanto, cuandox
estánull
no estamos tratando de invocar un método de unnull
objeto, sino más bien pasar unnull
objeto a un método estático. Si y solo si ese método busca unnull
parámetro y lo lanza cuando lo encuentra, un método de extensión se "invoca" en unnull
objeto.No estoy de acuerdo con esto:
es un truco de cualquier forma. Creo que es un buen ejemplo de código claro. Es absolutamente obvio lo que quiere lograr y que espera nulo.
ACTUALIZAR:
Ahora veo que no estabas diciendo que esto era un truco. Pero está implícito en la pregunta que piensas que de esta manera no es el camino a seguir. En mi opinión, definitivamente es la solución más clara.
fuente
Supongo que sería el camino más corto y también tendría una sobrecarga de rendimiento insignificante. Sin embargo, tenga en cuenta que no quedará muy claro para el lector del código cuál es la intención.
fuente
Concat
realidad hace una verificación nula debajo y devuelvestring.Empty
oarg0.ToString()
, lo que parece ser un poco más eficiente (quiero decir, estamos hablando de ms aquí).en realidad no entendí qué es lo que quieres hacer. Según tengo entendido, puede escribir este código de otra manera como esta. ¿Estás preguntando esto o no? ¿Puedes explicarme mas?
fuente
string s = string.IsNullOrEmpty(myObj) ? string.Empty : myObj.ToString();
Puede que me golpeen por mi respuesta, pero aquí va de todos modos:
Simplemente escribiría
cadena s = "" if (myObj! = null) {x = myObj.toString (); }
¿Hay alguna recompensa en términos de rendimiento por utilizar el operador ternario? No lo sé de la parte superior de mi cabeza.
Y claramente, como alguien mencionó anteriormente, puede poner este comportamiento en un método como safeString (myObj) que permite la reutilización.
fuente
Tuve el mismo problema y lo resolví simplemente lanzando el objeto a una cadena. Esto también funciona para objetos nulos porque las cadenas pueden ser nulos. A menos que no quiera tener una cadena nula, esto debería funcionar bien:
fuente
Algunas pruebas de rendimiento (de velocidad) que resumen las diversas opciones, no es que realmente importe #microoptimización (usando una extensión linqpad )
Opciones
Probablemente sea importante señalar que
Convert.ToString(...)
conservará una cadena nula.Resultados
Objeto
Cuerda
fuente
El comentario de Holstebroe sería su mejor respuesta:
Si
myObj
es nulo, Format coloca un valor de Cadena vacía allí.También satisface el requisito de una línea y es fácil de leer.
fuente
Aunque esta es una pregunta antigua y el OP pidió C #, me gustaría compartir una solución VB.Net para aquellos que trabajan con VB.Net en lugar de C #:
Desafortunadamente, VB.Net no permite el operador? Después de una variable, por lo que myObj? .ToString no es válido (al menos no en .Net 4.5, que utilicé para probar la solución). En su lugar, uso If para devolver una cadena vacía en caso de que myObj no sea Nothing. Entonces, el primer Tostring-Call devuelve una cadena vacía, mientras que el segundo (donde myObj no es Nothing) devuelve "42".
fuente