Saltar al contenido

Tipos genéricos abiertos y cerrados en C#

Esta es una de las características más poderosas de C#, que ayuda a los desarrolladores a definir estructuras de datos seguras como colecciones. Esto no solo resulta en una mejor calidad de código, sino que entre bastidores también añade un aumento decente del rendimiento. Lo demostraremos con una clase de dispositivo genérico. Este enfoque puede ser confuso, pero por el bien de la demostración vamos a utilizar la cadena y la flotación para describir un dispositivo. La clase tendrá dos propiedades, nombre y categoría. Usar el tipo de flotador puede ayudarnos a calcular los costos o la operación usando números todo el tiempo. No profundizaremos en esa parte por ahora.

El código:

Tipos genéricos abiertos y cerrados en C#
Tipos genéricos abiertos y cerrados en C#
1234567891011121314151617181920212223242526 que utiliza el sistema;namespace {publicclassDevice<T }}clasePúblicaGenérica{publicstaticvoidMain(){ Dispositivo<cadena;}; servidor =newDevice<cadena;}; Dispositivo<flotador;}; otro_servidor =newDevice<flotador;}; servidor. nombre ="Fabricam-DC1"; servidor.categoría ="Controlador de dominio"; otro_servidor.nombre =1.0f; otro_servidor.categoría =1.11f; Consola.WriteLine($"El servidor: {servidor.nombre} tiene categoría: {servidor.categoría}"); Consola.WriteLine($"El servidor: {otro_servidor.nombre} tiene categoría: {otro_servidor.categoría}"); Console.ReadKey();}}

csharp

El código produce la siguiente salida:

12El servidor: Fabricam-DC1 tiene categoría: Controlador de DominioEl servidor: 1 tiene categoría: 1.11

bash

Las instancias creadas tienen el parámetro genérico T pasado, que está en el primer caso cadena y el segundo caso flotante. Después de eso, cuando queramos establecer los valores de propiedades específicas, sólo podremos utilizar los tipos específicos. Esto se demuestra en la asignación de las propiedades de nombre y categoría. De esta manera, la seguridad de los tipos se asegura aceptando sólo los tipos de parámetros apropiados.

Si intentamos especificar algo más, el compilador se negará a ejecutar con el siguiente mensaje:

1CS0029 No se puede convertir implícitamente el tipo$0027<;type
bash

Esto nos permite saber que una vez que estamos vinculados a un tipo específico no se nos permite asignar otro tipo.

Ahora que hemos aclarado los genéricos, necesitamos hacer una clara distinción entre los genéricos abiertos y cerrados .