Home » Programacion » .Net C# » Diferencias entre Clases y Estructuras (Structs) C#

Diferencias entre Clases y Estructuras (Structs) C#

febrero 23rd, 2012 Posted in .Net C#, Ayuda Técnica, Programacion Tags:

La principal Diferencia entre Classes y Structs es que una es por referencia y la otra por valor. Leyendo el artículo de Koalite comencé a sentir curiosidad sobre el tema, es por ese mismo motivo por el que me dirigí directamente al artículo de la MSDN que mencionaba.

Una clase es un tipo de referencia. Cuando se crea un objeto de la clase, la variable a la que se asigna el objeto solo incluye una referencia a dicha memoria. Cuando la referencia a objeto se asigna a una nueva variable, la nueva variable hace referencia al objeto original. Los cambios realizados en una variable se reflejan en la otra variable porque ambas hacen referencia a los mismos datos.

Un struct es un tipo de valor. Cuando se crea un struct, la variable a la que se asigna incluye los datos reales del struct. Cuando el struct se asigna a una nueva variable, se copia. La nueva variable y la variable original contienen por tanto dos copias independientes de los mismos datos. Los cambios realizados en una copia no afectan a la otra copia.

En general, las clases se utilizan para modelar comportamiento más complejo o datos que se piensan modificar una vez creado un objeto de clase. Los structs son más adecuadas para pequeñas estructuras de datos que contienen principalmente datos que no se piensan modificar una vez creado el struct.

Todo esto es lo que nos comenta la MSDN. Sabia que se almacenaba una referencia al objeto de la clase, pero no lo había leído directamente de la MSDN. Es este el motivo el porque, en métodos donde pasamos objetos de clases como parámetros, estos pueden sufrir cambios cuando por defecto los parámetros son por valor. Es decir, el parámetro del método recibe directamente la referencia a memoria, y los cambios se verán reflejados. En cambio, para entenderlo, un struct funcionan como un tipo Int, String, …, es decir, por defecto será por valor y los datos serán una copia.

Supongo que la definición de las clases como referencia es debido al rendimiento. Imaginad que si el compilador tuviera que ir clonando los objetos, aunque tardara un poquito más, que multiplicado por las veces que podemos realizar esta operación en un proceso, ¿lo notaríamos?.

En definitiva, Clases por Referencia y Structs por Valor.

2 Comentarios en “Diferencias entre Clases y Estructuras (Structs) C#”

  1. “la definición de las clases como referencia es debido al rendimiento”

    Creo que no siempre es así. De hecho, para determinados patrones de uso es más eficiente usar structs. Como los structs se almacenan en la pila, reservar espacio para crear un struct es muy rápido (sólo hace falta incrementar el puntero de la pila), mientras que en el caso de una clase hay que reservar espacio en el heap y eso implica buscar un bloque de memoria libre y contiguo de tamaño suficiente para alojar la clase.

  2. Gracias Juanma por la aclaración.