viernes, 23 de marzo de 2012

Strings son inmutables

Uno de los interesantes aspectos de la clase System.String es que cuando se le asigna al objeto string su valor inicial, este dato no puede ser cambiado. Esto podría parecer una mentira ya que siempre estmos reasignando strings a nuevos valores y debido también a que System.String define un número de métodos que aparentan modificar el string (como el uppercase y lowercase). Pero si miras mas de cerca lo que ocurre te darás cuenta que los métodos del tipo string de hecho te están regresando un nuevo objeto string. Veamos un ejemplo:




Y aquí estan las pruebas, str1 no fué modificado:




La misma regla de inmutabilidad aplica también para el operador de asignación, veamos este ejemplo:



El codigo anterior no genera salida, pero vamos a ver el código intermedio que generó usando la herramienta ildasm.exe:




No entraré en detalles de lo que significa cada cosa, por ahora nos conformaremos con saber que el código del método StringsInmutables() generó el codigo intermedio que se muestra.

Pongamos atención a las líneas en donde están los strings : "Mi string" y "Mi nuevo string". Si observamos del lado izquiero de cada línea en cuestión vemos que ambas tienen en común la instrucción ldstr. ldstr entendámoslo como la instrucción de cargar un nuevo string (abreviación de load string). Vemos entonces que el primer string "Mi string" queda sin referencia, pues s2 ahora hará referencia al segundo string "Mi nuevo string" y "Mi string" quedará sin referencia ocupando memoria en el heap hasta que el Garbage Collector (GC. Recolector de basura) se ejecute y libere la memoria no utilizada.

Por último, no hay que alarmarse cuando se hacen asignaciones de nuevos strings a una variable pues el GC se ejecuta continuamente, además de que el uso de memoria es mínimo. Los problemas se presentan cuando las asiganciones o concatenaciones (sí, también ocurre en las concatenaciones) son muchas, pues empiezan a saturar el heap y a reducir el performance de nuestra aplicación, en esos casos es preferible usar el StringBuilder.

Espero que este artículo sea de utilidad, agradeceré sus comentarios, y si desean que se aborde sobre el ildasm.exe, StringBuilder o cualquier otro tema de su interés háganlo saber.

Programen felizmente!!!



Leonardo Landín
icolandin@gmail.com

No hay comentarios:

Publicar un comentario