sobreescribir sobrecargar metodo c# .net string object null

c# - sobreescribir - sobrecargar metodo tostring en java



¿Cómo hacer ToString para un objeto posiblemente nulo? (11)

Sería genial si Convert.ToString () tuviera una sobrecarga adecuada para esto.

Se ha producido un Convert.ToString(Object value) desde .Net 2.0 (aproximadamente 5 años antes de que se le pidiera esta Q), que parece hacer exactamente lo que usted desea:

http://msdn.microsoft.com/en-us/library/astxcyeh(v=vs.80).aspx

¿Me estoy perdiendo / malinterpretando algo realmente obvio aquí?

¿Hay una manera simple de hacer lo siguiente?

String s = myObj == null ? "" : myObj.ToString();

Sé que puedo hacer lo siguiente, pero realmente lo considero un hack:

String s = "" + myObj;

Sería genial si Convert.ToString () tuviera una sobrecarga adecuada para esto.


Algunas pruebas de rendimiento (velocidad) que resumen las distintas opciones, no es que realmente importe #microoptimization (usando una extensión linqpad )

Opciones

void Main() { object objValue = null; test(objValue); string strValue = null; test(strValue); } // Define other methods and classes here void test(string value) { new Perf<string> { { "coallesce", n => (value ?? string.Empty).ToString() }, { "nullcheck", n => value == null ? string.Empty : value.ToString() }, { "str.Format", n => string.Format("{0}", value) }, { "str.Concat", n => string.Concat(value) }, { "string +", n => "" + value }, { "Convert", n => Convert.ToString(value) }, }.Vs(); } void test(object value) { new Perf<string> { { "coallesce", n => (value ?? string.Empty).ToString() }, { "nullcheck", n => value == null ? string.Empty : value.ToString() }, { "str.Format", n => string.Format("{0}", value) }, { "str.Concat", n => string.Concat(value) }, { "string +", n => "" + value }, { "Convert", n => Convert.ToString(value) }, }.Vs(); }

Probablemente sea importante señalar que Convert.ToString(...) retendrá una cadena nula.

Resultados

Objeto

  • nullcheck 1.00x 1221 tics transcurridos (0.1221 ms) [en 10K repeticiones, 1.221E-05 ms por]
  • torsiones de coallesce 1.14x 1387 transcurridas (0.1387 ms) [en 10K repeticiones, 1.387E-05 ms por]
  • string + 1.16x 1415 ticks transcurridos (0.1415 ms) [en 10K repeticiones, 1.415E-05 ms por]
  • str.Concat 1.16x 1420 tics transcurridos (0.142 ms) [en 10K repeticiones, 1.42E-05 ms por]
  • Convierta 1.58x 1931 tics transcurridos (0.1931 ms) [en 10K repeticiones, 1.931E-05 ms por]
  • str.Format 5.45x 6655 tics transcurridos (0.6655 ms) [en 10K repeticiones, 6.655E-05 ms por]

Cuerda

  • nullcheck 1.00x 1190 tics transcurridos (0.119 ms) [en 10K repeticiones, 1.19E-05 ms por]
  • Convertir 1.01x 1200 ticks transcurridos (0.12 ms) [en 10K repeticiones, 1.2E-05 ms por]
  • Cadena + 1.04x 1239 tics transcurridos (0.1239 ms) [en 10K repeticiones, 1.239E-05 ms por]
  • 1.520 tiros de coallesce 1423 ticks transcurridos (0.1423 ms) [en 10K repeticiones, 1.423E-05 ms por]
  • str.Concat 4.57x 5444 ticks transcurridos (0.5444 ms) [en 10K repeticiones, 5.444E-05 ms por]
  • str.Format 5.67x 6750 tics transcurridos (0.675 ms) [en 10K repeticiones, 6.75E-05 ms por]

Con un método de extensión, puede lograr esto:

public static class Extension { public static string ToStringOrEmpty(this Object value) { return value == null ? "" : value.ToString(); } }

Lo siguiente no escribiría nada en la pantalla y no arrojaría una excepción:

string value = null; Console.WriteLine(value.ToStringOrEmpty());


El comentario de Holstebroe sería tu mejor respuesta:

string s = string.Format("{0}", myObj);

Si myObj es nulo, Format coloca allí un valor de Cadena vacía.

También satisface su requisito de una línea y es fácil de leer.


Me pueden dar una paliza por mi respuesta, pero aquí va de todos modos:

Simplemente escribo

string s = "" if (myObj! = null) {x = myObj.toString (); }

¿Hay algún beneficio en términos de rendimiento por usar el operador ternario? No lo sé por la parte superior de mi cabeza.

Y, claramente, como alguien mencionado anteriormente, puede poner este comportamiento en un método como safeString (myObj) que permita la reutilización.


No estoy de acuerdo con eso esto:

String s = myObj == null ? "" : myObj.ToString();

es un truco de alguna manera. Creo que es un buen ejemplo de código claro. Es absolutamente obvio lo que quieres lograr y que estás esperando 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, es definitivamente la solución más clara.


Tuve el mismo problema y lo resolví simplemente fundiendo el objeto en una cuerda. Esto también funciona para objetos nulos porque las cadenas pueden ser nulas. A menos que no desee absolutamente tener una cadena nula, esto debería funcionar bien:

string myStr = (string)myObj; // string in a object disguise or a null


en realidad no entendí qué es lo que quieres hacer. Según tengo entendido, puedes escribir este código de otra manera como esta. ¿Estás preguntando esto o no? ¿Puedes explicarme mas?

string s = string.Empty; if(!string.IsNullOrEmpty(myObj)) { s = myObj.ToString(); }


C # 6.0 Editar:

Con C # 6.0 ahora podemos tener una versión sucinta y sin cast del método orignal:

string s = myObj?.ToString() ?? "";

O incluso:

string s = $"{myObj}";

Respuesta Original:

String s = (myObj ?? String.Empty).ToString();

o

String s = (myObjc ?? "").ToString()

para ser aún más conciso.

Desafortunadamente, como se ha señalado, a menudo necesitará un molde en cada lado para que esto funcione con tipos de cadena o de objeto:

String s = (myObjc ?? (Object)"").ToString() String s = ((Object)myObjc ?? "").ToString()

Por lo tanto, aunque parezca elegante, el yeso casi siempre es necesario y no es tan breve en la práctica.

Como se sugirió en otra parte, recomiendo usar un método de extensión para hacer este limpiador:

public static string ToStringNullSafe(this object value) { return (value ?? string.Empty).ToString(); }


string s = String.Concat(myObj);

sería la forma más breve que supongo y también tendría una sobrecarga de rendimiento insignificante. Tenga en cuenta que no sería muy claro para el lector del código cuál es la intención.


string.Format("{0}", myObj);

string.Format formateará null como una cadena vacía y llamará a ToString () en objetos no nulos. Según lo entiendo, esto es lo que estabas buscando.