El problema se presenta cuando tienes que decidir sin usas una clase o una estructura, para ello se listan una serie de puntos referentes a las diferencias entre estas dos.
Las estructuras son:
- Tipos de valor.
- PRO. Pueden contener datos y funciones.
- PRO. Almacenan sus datos directamente en la estructura.
- PRO. No requieren una localidad en memoria.
- PRO. Son útiles para estructuras de datos pequeñas.
- CON. Afectan el desempeño.
- El constructor de la estructura simplemente devuelve el valor de la estructura.
- CON. Las variables, cada una tiene su copia del dato y no es posible realizar operaciones que afecten a otra.
- CON. No soporta herencia definida por el usuario, tienen herencia implícita desde el tipo Object.
Las clases:
- Contienen tipos y métodos.
- Son tipo de referencia.
- Requieren la asignación en forma dinámica de una dirección en memoria.
- No se ven afectadas por el tamaño de datos a manejar.
- Múltiples variables tienen referencia al mismo objeto.
- Es posible realizar operaciones d variables que afecten a otro objeto.
- Soportan herencia definida por el usuario.
Código de Ejemplo:
Program.cs
using System; namespace ConsoleAppStructvsClass { class Program { public struct pointStruct { public int x; public int y; public pointStruct(int _x, int _y) { this.x = _x; this.y = _y; } } static void Main(string[] args) { // Crear una instancia de la estructura pointStruct pointStruct ptStruct = new pointStruct(); ptStruct.x = 10; ptStruct.y = 10; Console.WriteLine("Los valores Iniciales de la Estructura son : " + ptStruct.x + " , " + ptStruct.y); modificarPuntoEstructura(ptStruct); Console.WriteLine("Valores del punto Estructura después del cambio : " + ptStruct.x + " , " + ptStruct.y); Console.WriteLine(); //Crear una instacia de la clase pointClass pointClass ptClass = new pointClass(10, 10); Console.WriteLine("Los valores Iniciales de la Clase son : " + ptClass.x + " , " + ptClass.y); modificarPuntoClase(ptClass); Console.WriteLine("Valores de la clase después del cambio : " + ptClass.x + " , " + ptClass.y); Console.WriteLine(); } private static void modificarPuntoClase(pointClass newptClass) { newptClass.x = 20; newptClass.y = 20; Console.WriteLine("Aquí esta dentro del método modificarPuntoClase "); Console.WriteLine("Los valores modificados de la newptStruct : " + newptClass.x + " , " + newptClass.y); } static void modificarPuntoEstructura(pointStruct newptStruct) { newptStruct.x = 20; newptStruct.y = 20; Console.WriteLine("Aquí esta dentro del método modificarPuntoEstructura "); Console.WriteLine("Los valores modificados de la newptStruct : " + newptStruct.x + " , " + newptStruct.y); } } }
pointClass.cs
namespace ConsoleAppStructvsClass { class pointClass { public int x; public int y; public pointClass(int _x, int _y) { this.x = _x; this.y = _y; } } }
Conclusión.
Las estructuras son tipos por valor y las clases son tipos de referencia, lo que quiere decir que en el momento que trabajamos con una estructura cuando asignamos un valor a una propiedad de la estructura la modificamos en su valor actual, cuando se trata de una clase como esta se aloja en una referencia en memoria, al modificar una propiedad de la clase se esta modificando en la referencia de la clase y todos los lugares donde esta es invocada.