Red de conocimiento informático - Conocimiento sistemático - ¿Cuál es el papel de los genéricos?

¿Cuál es el papel de los genéricos?

¿Cuáles son sus ventajas? ¿Tiene algún impacto en el rendimiento? ¿Cuál es su comportamiento cuando se ejecuta? ¿Qué tipos genéricos hay en .NET BCL? Dé un ejemplo de un tipo genérico que defina en la programación diaria. La función de los genéricos es la "reutilización de algoritmos". (Esto es realmente fácil de entender. El ArrayList original solo puede aceptar Objetos, pero ahora List puede aceptar cualquier tipo, lo que significa que los métodos de ArrayList son reutilizados por varios tipos. Sin embargo, los genéricos de Dot Net tienen algunas limitaciones. Es difícil para Debe realizar una abstracción algorítmica en tipos numéricos (tipos de valor) porque implica el problema de la sobrecarga de operadores. Al mismo tiempo, los parámetros de tipo genérico de Dot Net no se pueden restringir a un tipo de valor primitivo (como int, double, float). ¿Cuáles son sus ventajas? Primero: protección del código fuente. (Si conoce el mecanismo de implementación de las plantillas C para genéricos, sabrá que C "incluye" automáticamente una implementación basada en la llamada a los genéricos durante la compilación, de modo que el contenido de los genéricos quede expuesto. Implementación de DotNet El método es diferente. Las clases y métodos genéricos se compilarán en IL Durante la ejecución, el JIT es responsable de cambiar el IL al código local para parámetros de tipo específicos, protegiendo así el código fuente). Segundo: seguridad de tipos. (Esto es lo más obvio: abandone todo tipo de conversiones feas cuando use ArrayList) Tercero: código más claro. Debido a que no hay conversión de tipos forzada, el código es naturalmente más claro, pero cuando se usan genéricos, a veces puede resultar confuso. Afortunadamente, los métodos genéricos se pueden simplificar aún más mediante la inferencia de tipos o el método de escritura. Cuarto: mejor rendimiento, porque los tipos de valor pueden evitar las pérdidas causadas por el boxeo y el unboxing (también se reducirá el número de recolecciones de basura). (Esta es la magia de los genéricos. En la historia del desarrollo, un aumento en las capacidades de abstracción a menudo significa una disminución en el rendimiento, ¡pero ese no es el caso de los genéricos! Los genéricos son algoritmos abstractos, pero la implementación de genéricos en C y DotNet puede hacer que el rendimiento no se vea comprometido. . y más rápido. Los genéricos de borrado de Java no tienen este beneficio de rendimiento. Tiene un impacto positivo en el rendimiento, porque los tipos de valores pueden evitar los efectos negativos del boxeo y unboxing, evitar la recolección de basura y mejorar significativamente el rendimiento. Pero este efecto no es obvio para los tipos de referencia. Pero cabe señalar que la primera vez que se llama a un método para un tipo de datos específico, CLR generará código nativo para este método. Esto aumenta el tamaño del conjunto de trabajo de la aplicación, lo que afecta el rendimiento. ¿Cuál es su comportamiento cuando se ejecuta? Un método que utiliza parámetros de tipo genérico Durante la compilación JIT, CLR obtiene el IL, lo reemplaza con el argumento de tipo especificado y luego crea código nativo. Es importante tener en cuenta que los tipos de referencia son el código más compartido, mientras que los tipos de valor generarán un código de tipo separado para cada tipo. Sin embargo, cabe señalar que este intercambio de código de tipos de referencia no hace que el tipo cerrado ejecute el constructor solo una vez (incluso el constructor estático es así). ¿Qué tipos genéricos hay en .NET BCL? Lista, Diccionario, Cola, Pila, Lista Ordenada y Diccionario Ordenado, Lista Vinculada, etc. Dé un ejemplo de un tipo genérico que defina en la programación diaria. La aparición de genéricos reemplazará algunos de los usos originales del polimorfismo para mejorar el rendimiento y brindar una mejor verificación en tiempo de compilación, de modo que ya no sean necesarias conversiones frecuentes entre subclases y superclases (interfaces).