Creación de datos encapsulados con estructuras en C#
Al trabajar en el proyecto para realizar un seguimiento de los detalles del pedido, necesita una manera de mantener la información relacionada, como el nombre del cliente, la dirección de envío y el total de pedidos juntos. Las estructuras de C# le permiten crear un contenedor encapsulado básico para estos datos, lo que facilita el trabajo con y el paso a paso como una sola unidad.
Descripción de las estructuras
Las estructuras son tipos de valor en C#, lo que significa que almacenan directamente sus datos en lugar de hacer referencia a ellos. Use la struct palabra clave para definir una estructura. Las estructuras se usan normalmente para tipos pequeños y centrados en datos que proporcionan un comportamiento mínimo.
- Las estructuras tienen semántica de valores, lo que significa que sus valores se copian durante las llamadas de asignación o método.
- Entre los casos de uso comunes se incluyen la representación de números, valores booleanos, caracteres e instancias de hora.
- Las estructuras se usan normalmente para representar datos ligeros como formas geométricas (por ejemplo,
Rectangle,Circle), coordenadas o valores de configuración.
Las estructuras son más adecuadas para datos pequeños, inmutables y críticos para el rendimiento. Para objetos más grandes y complejos o cuando el comportamiento es un enfoque, considere la posibilidad de usar clases en su lugar. A diferencia de las clases, las estructuras no pueden heredar de otras estructuras o clases, pero pueden implementar interfaces.
Sugerencia
Si el tipo se centra en el comportamiento en lugar de en los datos, las clases suelen ser una mejor opción debido a su semántica de referencia.
Definir e implementar una estructura
public struct Point
{
public int X;
public int Y;
public Point(int x, int y)
{
X = x;
Y = y;
}
}
El ejemplo de código muestra cómo definir una estructura con campos y un constructor en C#.
Las estructuras también pueden implementar interfaces, pero no pueden heredar de otras clases o estructuras.
Encapsular datos con estructuras
La encapsulación permite controlar el acceso a los datos dentro de una estructura. Use modificadores de acceso como private, publico internal para especificar la accesibilidad.
- Los campos y propiedades se pueden hacer privados para restringir el acceso directo.
- Los métodos pueden proporcionar formas controladas de interactuar con los datos.
Por ejemplo:
public struct Rectangle
{
private int width;
private int height;
public Rectangle(int width, int height)
{
this.width = width;
this.height = height;
}
public int Area => width * height;
}
El ejemplo de código muestra una estructura en C# con campos encapsulados y una propiedad calculada para el área.
Aplicar modificador readonly a structs para la inmutabilidad
La inmutabilidad garantiza que una vez creada una estructura, sus datos no se pueden cambiar. Una estructura es útil cuando se trabaja con datos que deben permanecer constantes durante toda su duración, como coordenadas o valores de configuración. Al aplicar el modificador a una estructura, puede aplicar inmutabilidad, lo que hace que el readonly código sea más predecible y menos propenso a errores causados por modificaciones no deseadas.
public readonly struct ImmutablePoint
{
public int X { get; init; }
public int Y { get; init; }
public ImmutablePoint(int x, int y)
{
X = x;
Y = y;
}
}
El ejemplo de código muestra el uso del readonly modificador para crear una estructura inmutable en C#.
Nota:
Aunque la propia estructura es inmutable, los tipos de referencia mutables dentro de él todavía pueden cambiar su estado.
Usar inicializadores de objeto con estructuras
Al trabajar con estructuras, a menudo es necesario inicializar varias propiedades. Los inicializadores de objeto proporcionan una manera sencilla y legible de crear e inicializar instancias de estructura en un solo paso. Este enfoque reduce el código repetitivo y hace que la intención sea clara.
En el ejemplo de código siguiente se define una estructura con propiedades que agrupan datos relacionados y facilitan la inicialización y el trabajo con instancias de la estructura.
public struct Point
{
public int X { get; set; }
public int Y { get; set; }
}
Con un inicializador de objeto, puede crear e inicializar un Point:
var point = new Point { X = 10, Y = 20 };
El ejemplo de código muestra cómo usar un inicializador de objeto para establecer valores de propiedad al crear una instancia de estructura.
Sugerencia
Los inicializadores de objetos hacen que el código sea más conciso y fácil de leer al trabajar con estructuras que tienen varias propiedades.
Ejemplo práctico: Uso de estructuras para representar puntos en el espacio 2D
Las estructuras a menudo se usan para representar estructuras de datos pequeñas e inmutables. Por ejemplo, puede usar una estructura para representar un punto en el espacio 2D y calcular la distancia entre dos puntos:
public struct Point
{
public int X { get; }
public int Y { get; }
public Point(int x, int y)
{
X = x;
Y = y;
}
public double DistanceTo(Point other)
{
int dx = X - other.X;
int dy = Y - other.Y;
return Math.Sqrt(dx * dx + dy * dy);
}
}
var point1 = new Point(3, 4);
var point2 = new Point(7, 1);
Console.WriteLine($"Distance between points: {point1.DistanceTo(point2)}");
En este ejemplo se muestra cómo definir una estructura para un punto, calcular la distancia entre dos puntos y usar la estructura en un programa simple.
La combinación de encapsulación, inmutabilidad e inicializadores de objetos permite crear estructuras que sean eficaces y predecibles. Estas características le ayudan a administrar los datos relacionados de forma limpia y organizada.