Pregunta

Mi compañero de trabajo es nuevo en C # y no sabía nada acerca del operador de fusión. Entonces, lo vi escribir una línea de código como esta:

string foo = "" + str;

La idea es que si str es nulo, esta expresión devolverá una cadena vacía. Por supuesto, eso podría reescribirse como este:

string foo = str ?? "";

Y siento que sería más legible. ¿Pero es realmente tan importante? ¿Son los beneficios de legibilidad suficientes para sugerir volver atrás y hacer que esas líneas se vean como la segunda? ¿O es una de esas cosas que debería aprender a dejar de lado (siempre que mi compañero de trabajo esté educado sobre la mejor manera de hacer esto en el futuro)?

EDIT : solo una nota, aprecio los comentarios de eficiencia, pero esto realmente no se usa en ninguna situación en la que ese rendimiento sea crítico. Entonces, si bien esa información es interesante, no es necesariamente lo que creo que es importante.

¿Fue útil?

Solución

En mi opinión, es mucho mejor definir claramente esa lógica, es decir, no usar concatenación de cadenas para evitar cadenas nulas y usar una declaración condicional o ?? operador.

Respecto a otros comentarios:

  

también hay un beneficio de rendimiento para   utilizando el operador de unión nula,   ya que no necesita concatenación   (y, por lo tanto, ninguna cadena extra   la instancia se está creando   innecesariamente)

No es cierto. El compilador de C # compila " " + string2 al 100% del mismo código que string1? " " ;. Además, el compilador C # traduce el operador + para llamar al método string.Concat que a su vez verifica los argumentos con la función string.IsNullOrEmpty y no asigna una nueva cadena en este caso.

  

También recomendaría el uso de   String.Empty over " " como es un   constante y no requiere la   creación de una nueva cadena

.NET framework admite interning de cadena así que " " y string.El punto vacío a la misma región de memoria

Otros consejos

No creo que uno sea más legible que el otro personalmente. Prefiero esto:

string foo = str ?? "";

simplemente porque me gusta mucho el ?? operador.

Si eres un novato de la marca, creo que esto sería un poco más fácil de entender:

string foo = str == null ? "" : str;

o

string foo = "";
if (str != null) foo = str;

Sin embargo, debes preguntarte a ti mismo, " ¿Qué tan simple realmente quieres obtener? "

Aunque prefiero la segunda línea desde la perspectiva técnica, la primera línea es más legible para mí ...

La segunda línea me parece más legible, aclara la intención de la expresión del lado derecho.

Preferiría su segundo ejemplo al primero, ya que es más proactivo en contra de que str sea nulo y sea más expresivo. También recomendaría el uso de String.Empty sobre " " , ya que es una constante y no requiere la creación de una nueva cadena (y sí, este es un problema extremo, pero es importante tenerlo en cuenta).

¿Usaré el operador de fusión o foo = str == null? " " : str; por dos razones:

  1. El primer ejemplo no tiene el mismo comportamiento en otros lenguajes de tipo curly (particularmente Java y JavaScript), donde agregar una referencia nula a una cadena vacía da como resultado una cadena que contiene el texto null . Como resultado, el primer ejemplo requiere mucho más esfuerzo mental para garantizar que se produzca el comportamiento correcto en el idioma que se está creando. Incluso dadas otras pistas, es C # (como el tipo string en minúsculas), cualquier cosa que requiera que el desarrollador disminuya la velocidad y piense "cuál es la intención de este código" resultados en la pérdida de productividad. También podría introducir errores al pasar de un idioma a otro.

  2. El segundo ejemplo expresa más claramente la intención del código, que, tal como se describe en la pregunta original, es:

    cuando str es nulo, establece foo en una cadena vacía

    A diferencia del primer ejemplo, que puede leerse como:

    establece foo en una cadena vacía con str anexada (lo que puede tener el efecto secundario de configurar foo en una cadena vacía cuando str es nulo)

Como programadores, probablemente deberíamos intentar expresar el intento de nuestro código, en lugar de confiar en los efectos secundarios de otras operaciones para obtener los resultados que queremos.

aquí hay un artículo sobre string.empty vs " "

http://blogs.msdn.com/brada /archive/2003/04/22/49997.aspx

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top