Entendiendo los Structs en C#: Definición, Uso y Diferencias Clave
Structs en C#
Aprende a definir, instanciar y trabajar con structs en C#, incluyendo constructores, propiedades y sus diferencias clave con las clases.
En C#, un struct (estructura) funciona de manera similar a una clase pero es un tipo por valor, lo que significa que almacena los datos directamente en lugar de una referencia.
Supongamos que queremos almacenar el nombre y la edad de una persona. Podemos crear dos variables: nombre y edad y almacenar valores.
Sin embargo, si necesitamos mantener esta información para varias personas, declarar variables separadas se vuelve tedioso. Definir un struct que contenga nombre y edad nos permite reutilizar el mismo diseño para cada persona.
Definir struct en C#
En C#, usamos la palabra clave struct para declarar un struct. Por ejemplo:
struct Empleado { public int id; }
Aquí, id es un campo dentro del struct. Un struct también puede contener métodos, indexadores y más.
Declarar variable struct
Antes de usar un struct, debes crear una variable de struct. La sintaxis es:
struct Empleado { public int id; } // declarar emp de struct Empleado Empleado emp;
En el ejemplo, definimos un struct llamado Empleado y declaramos una variable emp de ese tipo.
Acceder a struct en C#
Accede a los miembros del struct usando el operador punto (.):
Empleado emp; emp.id = 1;
Esto asigna el valor 1 al campo id del struct Empleado.
Nota: Los tipos primitivos como int, bool y float son structs predefinidos en C#.
Ejemplo: Struct en C#
using System; namespace CsharpStruct { // definiendo struct struct Empleado { public int id; public void obtenerId(int id) { Console.WriteLine("ID de Empleado: " + id); } } class Programa { static void Main(string[] args) { // declarar emp de struct Empleado Empleado emp; // accede y establece campo del struct emp.id = 1; // accede a métodos del struct emp.obtenerId(emp.id); Console.ReadLine(); } } }
Salida
ID de Empleado: 1
El programa crea un struct Empleado, establece su campo id y llama al método obtenerId para mostrarlo.
También puedes instanciar un struct con la palabra clave new:
Empleado emp = new Empleado();
Esto llama al constructor sin parámetros e inicializa todos los campos a sus valores por defecto.
Constructores en Structs de C#
Los structs pueden definir constructores para inicializar campos. Ejemplo:
struct Empleado { public int id; // constructor public Empleado(int idEmpleado) { id = idEmpleado; } }
Nota: Antes de C# 10, los structs no pueden contener constructores sin parámetros.
Ejemplo: Constructor en Structs de C#
using System; namespace CsharpStruct { // definiendo struct struct Empleado { public int id; public string nombre; // constructor con parámetros public Empleado(int idEmpleado, string nombreEmpleado) { id = idEmpleado; nombre = nombreEmpleado; } } class Programa { static void Main(string[] args) { // llama al constructor del struct Empleado emp = new Empleado(1, "Brian"); Console.WriteLine("Nombre del Empleado: " + emp.nombre); Console.WriteLine("ID del Empleado: " + emp.id); Console.ReadLine(); } } }
Salida
Nombre del Empleado: Brian ID del Empleado: 1
En este ejemplo, el constructor asigna valores a todos los campos. No inicializar cada campo resulta en error de compilación.
Propiedades en Structs de C#
Los structs pueden exponer propiedades para encapsulación. Ejemplo:
using System; namespace CsharpStruct { // definiendo struct struct Empleado { public int id; // crea propiedad public int Id { get { return id; } set { id = value; } } } class Programa { static void Main(string[] args) { Empleado emp = new Empleado(); emp.Id = 1; Console.WriteLine("ID del Empleado: " + emp.Id); Console.ReadLine(); } } }
Salida
ID del Empleado: 1
Aquí, la propiedad Id proporciona acceso controlado al campo id.
Diferencia entre class y struct en C#
Aunque las clases y structs comparten sintaxis similar, difieren fundamentalmente:
- Una clase es un tipo por referencia; un struct es un tipo por valor.
- Asignar una instancia de clase copia una referencia, así que dos variables apuntan al mismo objeto. Asignar un struct copia el valor completo.
- Los structs no soportan herencia, mientras que las clases sí.
Ejemplo de comportamiento de referencia de clase:
using System; namespace CsharpStruct { class Empleado { public string nombre; } class Programa { static void Main(string[] args) { Empleado emp1 = new Empleado(); emp1.nombre = "Juan"; Empleado emp2 = emp1; emp2.nombre = "Ed"; Console.WriteLine("Nombre Empleado1: " + emp1.nombre); Console.ReadLine(); } } }
Salida
Nombre Empleado1: Ed
Ejemplo de comportamiento de valor de struct:
using System; namespace CsharpStruct { struct Empleado { public string nombre; } class Programa { static void Main(string[] args) { Empleado emp1 = new Empleado(); emp1.nombre = "Juan"; Empleado emp2 = emp1; emp2.nombre = "Ed"; Console.WriteLine("Nombre Empleado1: " + emp1.nombre); Console.ReadLine(); } } }
Salida
Nombre Empleado1: Juan
En el ejemplo del struct, emp2 recibe una copia de emp1, por lo que modificaciones a emp2 no afectan a emp1.
Estas distinciones hacen que los structs sean ideales para pequeñas estructuras de datos inmutables que se benefician de la asignación en pila y semántica de valor.
Lenguaje C
- El caso para modernizar la planificación de turnos y retener talento y productividad
- Mejore la seguridad laboral: por qué las verificaciones periódicas de antecedentes de empleados son importantes
- 4 estrategias probadas para fortalecer el compromiso de empleados durante la COVID-19
- DVIRC asciende a Alan Shell a Director de Servicios Lean/CI y da la bienvenida a nuevas contrataciones
- Mejorando la seguridad laboral: Cómo la robótica manufacturera protege a los empleados
- Mantente Adelante en Futuro del Trabajo: Estrategias para Vencer Competencia
- Analítica de Productividad de Empleados: Desbloqueando Insights en la Era IoT
- Dominando structs en C: Definición, variables, acceso y ejemplos avanzados
- Dominando structs y punteros en C: Guía práctica
- Dominando structs en C: Paso, retorno y manejo por referencia
- Structs en C++ explicados con un ejemplo práctico