You are on page 1of 3

Unidad I. Tipo de datos definidos por el usuario.

Estructuras Ing. Manuel Juan Gereca Tijerina

Estructuras
Concepto de estructura
Una estructura es un tipo especial de clase pensada para representar objetos ligeros. Es decir, que ocupen poca memoria y deban ser manipulados con velocidad, como objetos que representen puntos, fechas, etc. Ejemplos de estructuras incluidas en la BCL son la mayora de los tipos bsicos (excepto string y object), y de hecho las estructuras junto con la redefinicin de operadores son la forma ideal de definir nuevos tipos bsicos a los que se apliquen las mismas optimizaciones que a los predefinidos.

Diferencias entre clases y estructuras


A diferencia de una clase y fiel a su espritu de ligereza, una estructura no puede derivar de ningn tipo y ningn tipo puede derivar de ella. Por estas razones sus miembros no pueden incluir modificadores relativos a herencia, aunque con una excepcin: pueden incluir override para redefinir los miembros de System.Object. Otra diferencia entre las estructuras y las clases es que sus variables no almacenan referencias a zonas de memoria dinmica donde se encuentran almacenados objetos sino directamente referencian a objetos. Por ello se dice que las clases son tipos referencia y las estructuras son tipos valor, siendo posible tanto encontrar objetos de estructuras en pila (no son campos de clases) como en memoria dinmica (son campos de clases) Una primera consecuencia de esto es que los accesos a miembros de objetos de tipos valor son mucho ms rpidos que los accesos a miembros de pilas, ya que es necesario pasar por una referencia menos a la hora de acceder a ellos. Adems, el tiempo de creacin y destruccin de estructuras tambin es inferior. De hecho, la destruccin de los objetos almacenados en pila es prcticamente inapreciable ya que se realiza con un simple decremento del puntero de pila y no interviene en ella el recolector de basura. Otra consecuencia de lo anterior es que cuando se realicen asignaciones entre variables de tipos valor, lo que se va a copiar en la variable destino es el objeto almacenado por la variable fuente y no la direccin de memoria dinmica a la que apuntaba sta. Por ejemplo, dado el siguiente tipo (ntese que las estructuras se definen igual que las clases pero usando la palabra reservada struct en vez de class):

Unidad I. Tipo de datos definidos por el usuario.


Estructuras Ing. Manuel Juan Gereca Tijerina

struct Point { public int x, y; public Point(int x, int y) { this.x = x; this.y = y; } }

Si usamos este tipo en un cdigo como el siguiente:


Punto p = new Punto(10,10); Punto p2 = p; p2.x = 100; Console.WriteLine(p.x);

Lo que se mostrar por pantalla ser 10. Esto se debe a que el valor de x modificado es el de p2, que como es una copia de p los cambios que se le hagan no afectarn a p. Sin embargo, si Punto hubiese sido definido como una clase entonces s que se hubiese mostrado por pantalla 100, ya que en ese caso lo que se habra copiado en p2 habra sido una referencia a la misma direccin de memoria dinmica referenciada por p, por lo que cualquier cambio que se haga en esa zona a travs de p2 tambin afectar a p. De lo anterior se deduce que la asignacin entre objetos de tipos estructuras es mucho ms lenta que la asignacin entre objetos de clases, ya que se ha de copiar un objeto completo y no solo una referencia. Para aliviar esto al pasar objetos de tipos estructura como parmetros, se da la posibilidad de pasarlos como parmetros por referencia (modificador ref) o parmetros de salida (out) en vez de como parmetros de entrada. Todas las estructuras derivan implcitamente del tipo System.ValueType, que a su vez deriva de la clase primigenia System.Object. ValueType tiene los mismos miembros que su padre, y la nica diferencia sealable entre ambos es que en ValueType se ha redefinido Equals() de modo que devuelva true si los objetos comparados tienen el mismo valor en todos sus campos y false si no. Es decir, la comparacin entre estructuras con Equals() se realiza por valor. Respecto a la implementacin de la igualdad en los tipos definidos como estructuras, tambin es importante tener muy en cuenta que el operador == no

Unidad I. Tipo de datos definidos por el usuario.


Estructuras Ing. Manuel Juan Gereca Tijerina

es en principio aplicable a las estructuras que defina el programador. Si se desea que lo tenga ha de drsele explcitamente una redefinicin al definir dichas estructuras.
Fuente: http://www.devjoker.com/print/Tutorial-C/161/Tutorial-C.aspx