clr .net-4.0 c#-4.0

Diferencia entre CLR 2.0 y CLR 4.0



.net-4.0 c#-4.0 (7)

He leído innumerables blogs, publicaciones y preguntas sobre StackOverflow sobre las nuevas características de C # 4.0. Incluso las nuevas características de WPF 4.0 han comenzado a salir a la luz. Lo que no pude encontrar y me gustaría saber:

  1. ¿Cuáles son los principales cambios en CLR 4.0 desde una perspectiva de desarrollador C # / WPF?
  2. ¿Cuáles son los principales cambios en CLR 4.0 en su conjunto?

Creo que, internamente, la mayoría de los cambios son para los nuevos lenguajes dinámicos y la programación paralela. ¿Pero hay otras mejoras importantes? Porque las mejoras en el lenguaje son solo eso, mejoras en el lenguaje. Solo necesita el compilador nuevo y esas características se pueden usar con una versión inferior de .Net, aparte de la versión 1.0 / 1.1 (al menos la mayoría de ellas se pueden usar).

Y si las características anteriores son las únicas, solo para estas características la versión se cambia a 4.0, que creo que es 4.0 debido a que está basado en la versión .Net 4.0 (es decir, después de 1.0 / 1.1, 2.0 y 3.0 / 3.5). ¿Está justificado el incremento de la versión?

Editado:

Como señaló Pavel Minaev en los comentarios, incluso esas dos características son independientes de CLR. Hubo velocidad y otras mejoras en 3.0 y 3.5 también. Entonces, ¿por qué la versión se incrementa?


Hay una gran cantidad de cambios.

En el CLR en sí mismo, hay algunos cambios. El recolector de elementos no utilizados se está modificando para admitir la recopilación concurrente de gen0 / 1 y gen2 en modo de estación de trabajo. Además, hay algunos cambios en cómo se implementa la seguridad. El marco paralelo cambia parte de la implementación de CLR del grupo de subprocesos (que no se gestiona por completo, sino que forma parte del tiempo de ejecución en sí). Además, hay algunos cambios en el sistema de tipos, principalmente relacionados con el nuevo soporte de PIA COM.

Los mayores cambios son probablemente más cambios de biblioteca / marco, en lugar de cambios de CLR. como la integración del DLR en el marco y el nuevo tipo dinámico. En términos de marco, usted tiene el marco reactivo, las extensiones paralelas de la biblioteca, los contratos de código, el soporte de tuplas y muchos pequeños cambios (es decir: Enum.TryParse , Lazy<T> , y toneladas de otras mejoras pequeñas, pero agradables).


Muchos tipos de interfaces y delegados centrales en el CLR se han actualizado para respaldar la covarianza y la contravarianza genéricas . Por ejemplo, IEnumerable<T> se ha cambiado a IEnumerable<out T> .


No creo que haya nuevas instrucciones de IL. El nuevo CLR tiene mejoras en cosas como inline y recolección de basura que hacen el mismo trabajo que el 2.0 CLR, pero es mejor. Una máquina virtual (como CLR o JVM) es un concepto abstracto con múltiples implementaciones posibles. Creo que CLR 4.0 es la misma máquina abstracta que en CLR 2.0, solo que con una implementación mejorada.

Incluso el nuevo material dinámico es solo un truco de compilación con nuevas API (a diferencia de Java, donde se lo propone como un nuevo código de operación ).

Si estoy equivocado acerca de esto, ¡me encantaría saberlo!



Traté de ver algunas de las nuevas cosas de C # en Reflector, para ver si hay algo nuevo debajo de:

  • los tipos dinámicos se traducen al objeto s, a través del compilador magic, que agrega llamadas a la biblioteca para manejar el enlace de tiempo de ejecución.
  • Los parámetros opcionales se manejan a través del compilador. Si llama a Foo (int x = 5), sin especificar un valor para x, verá la llamada como Foo (5) en Reflector.

Así que supongo que los cambios no son nada que pueda detectar fácilmente (como el soporte genérico en CLR 2.0).



Una nueva cosa CLR que conozco es una forma de tipado estructural para interfaces, estructuras y delegados en aras del soporte de NoPIA ; básicamente, permite que el tiempo de ejecución trate tipos distintos con definiciones equivalentes como si fueran lo mismo, por lo tanto, si dos ensamblajes A y B tienen cada uno una interfaz COM importada IFoo declarada en ellos, con el mismo IID y los mismos miembros, el tiempo de ejecución los tratará como tipos equivalentes; así que si hay una instancia de alguna clase Foo implementando [A]IFoo , puedes convertirlo a [B]IFoo , y el elenco funcionará.

Otra cosa es la capacidad de alojar varias versiones de CLR una al lado de la otra en un único proceso. No puede alojar 1.x y 2.0 en un proceso, por ejemplo, pero puede alojar 2.0 y 4.0. El principal beneficio de esto es la capacidad de cargar complementos escritos para cualquiera de las versiones de CLR al mismo tiempo.

Un pequeño inconveniente es que algunas excepciones más se han vuelto inalcanzables, como Exception en 2.0; por ejemplo, ya no puede detectar AccessViolationException .

Además, aquí hay una presentación de PowerPoint sobre CLR 4.0 de PDC 2008. Puede que esté un poco anticuado ahora, pero la mayoría de las cosas que se mencionan allí parecen estar en las versiones beta.