.NET Buenas Prácticas – Clases y estructuras


No es común por los desarrolladores, pero es importante entender entre si diseñar un tipo como clase (un tipo de referencia) o como una estructura (un tipo de valor).
Para ello es crucial la diferencia entre tipos por referencia y valor.

La primera diferencia que hay que considerar es que los de referencia se asignan en el heap y pasan por el garbage collector, mientras que los de valor se asignan en el stack o inline cuando contienen tipos y se desasignan cuando el stack se desarma o cuando el tipo se desasigna. Por lo tanto, las asignaciones y desasignaciones de los tipos de valor son en general más baratas que los tipos de referencia.

Las matrices de tipos de referencia se asignan out of line, lo que significa que los elementos de la matriz son solo referencias a instancias del tipo de referencia que reside en el heap. Las matrices de tipo de valor se asignan inline, lo que significa que los elementos de la matriz son las instancias reales del tipo de valor. Por lo tanto, las asignaciones y desasignaciones de las matrices de tipo de valor son mucho más baratas que las de matrices de tipo de referencia.

Otra diferencia es respecto al uso de la memoria.
Los de valor hacen boxing cuando se convierten a un tipo de referencia o una de las interfaces que implementan y hacen unboxing cuando se devuelven al tipo de valor. Dado que los boxings son objetos que se asignan en el heap y recolectados por el garbage collector, demasiado boxing y unboxing pueden tener un impacto negativo en el heap, en el garbage collector y en el rendimiento de la aplicación. Por el contrario, no se produce este tipo de boxing cuando se emiten los tipos de referencia.

Las asignaciones de tipo de referencia copian la referencia, mientras que las asignaciones de tipo de valor copian todo el valor. Por lo tanto, las asignaciones de tipos de referencia grandes son más baratas que las asignaciones de tipos de valores grandes.

Los tipos de referencia se pasan por referencia, mientras que los tipos de valor se pasan por valor. Los cambios en una instancia de un tipo de referencia afectan a todas las referencias que apuntan a la instancia. Las instancias de tipo de valor se copian cuando se pasan por valor. Cuando se cambia una instancia de un tipo de valor, por supuesto, no afecta a ninguna de sus copias. Debido a que las copias no son creadas explícitamente por el usuario, sino que se crean implícitamente cuando se pasan los argumentos o se devuelven los valores devueltos, los tipos de valores que se pueden cambiar pueden confundir a muchos usuarios. Por lo tanto, los tipos de valor deben ser inmutables.

La mayoría de los tipos en un framework deben ser clases. Sin embargo, hay algunas situaciones en las que las características de un tipo de valor hacen que sea más apropiado utilizar estructuras.

Use una estructura en lugar de una clase si las instancias del tipo son pequeñas y, por lo general, duran poco o están comúnmente incrustadas en otros objetos.

Evite definir una estructura a menos que el tipo tenga todas las características siguientes:

-Lógicamente representa un solo valor, similar a los tipos primitivos (int, double, etc.).

-Tiene un tamaño de instancia inferior a 16 bytes.

-Es inmutable.

-No tendrá que hacer boxing con frecuencia.

En todos los demás casos, debe definir sus tipos como clases.

GOTO Topic Index

 

This content is property of Matias Creimerman.
Any misuse of this material will be punishable.
Creative Commons License
This work is licensed under a
Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License.

About the author:

Matías Creimerman
Matías Creimerman

Profesional Website

Linkedin

Blog

Medium

Youracclaim Badges

Microsoft Tech Profile

Aboutme

Connection

Portfoliobox

Github

ASP.NET Forum

Facebook

Twitter

Youtube

Crunchbase

Matías Creimerman Certifications

Matias Creimerman

 

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s