2009-10-26 14 views
21

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:Diferencia entre CLR 2.0 y CLR 4.0

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

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 nuevo compilador 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 porque está basado en la versión .Net 4.0 (es decir, después de 1.0/1.1, 2.0 & 3.0/3.5). ¿Está justificado el incremento de la versión?

Editado:

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

+1

Ni la compatibilidad dinámica de idiomas ni la programación paralela son compatibles con CLR directamente. Los lenguajes dinámicos son compatibles con DLR, que se basa en CLR (y no utiliza nada específico para él, y puede ejecutarse en 2.0 muy bien). Parallel FX es solo una biblioteca. –

Respuesta

11

Una nueva cosa CLR que conozco es una forma de tipado estructural para interfaces, estructuras y delegados por el bien de NoPIA support - básicamente, permite que el tiempo de ejecución trate tipos distintos con definiciones equivalentes como si fueran lo mismo - entonces si dos conjuntos 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, puede convertirlo a [B]IFoo, y el molde funcionará.

Otra cosa es la capacidad de alojar varias versiones de CLR una al lado de la otra en un solo 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 StackOverflowException estaba en 2.0, por ejemplo, no puede detectar AccessViolationException.

Además, here es una presentación de PowerPoint en 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.

+0

@Pavel, ¿por qué no puedes ver esas excepciones en 4? ¿Están obsoletos? –

+0

Se hicieron inalcanzables deliberadamente, porque no hay una razón legítima para que una aplicación los atrape. Para 'StackOverflowException', esto se debe a que es una condición en la que cualquier código de control de errores no podría hacer mucho, de todos modos (si no está en la pila, ni siquiera puede hacer una llamada a un método ...) Para 'AccessViolationException', se debe a que, por su propia naturaleza, no es determinista; una operación que causaría uno también podría leer (o, peor aún, escribir) alguna región de memoria no relacionada; así que atraparlo siempre es un problema de diseño. –

+2

La 'AccessViolationException' puede haberse vuelto inaccesible porque Code Access Security ha quedado en desuso, lo que hace que esa excepción se desaproveche: http://www.infoq.com/news/2010/01/CAS-.NET-4.0. Nunca ha sido determinista, seguramente no en áreas en las que desea permitir que se ejecute código alienígena. – Abel

2

No creo que haya nuevas instrucciones de IL. El nuevo CLR tiene mejoras en cosas como la recolección de basura y en línea 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 sólo un truco compilador con nuevas APIs (a diferencia de Java where it's being proposed as a new opcode.)

Si estoy equivocado en esto, me gustaría saber!

+0

Debe haber uno (107), Reflector sigue lanzando excepciones sobre eso :) – leppie

4

Hay una gran cantidad de cambios.

En el CLR en sí, 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, tiene el marco reactivo, extensiones paralelas de la biblioteca, contratos de código, soporte de tuplas y muchos pequeños cambios (por ejemplo: Enum.TryParse, Lazy<T>, y toneladas de otras mejoras pequeñas, pero agradables).

+3

'dynamic' es un artefacto C#, y no es un tipo CLR. ¿Y de qué "integración de DLR en el CLR" hablas? DLR es realmente solo una biblioteca. –

+0

Cierto, puedo editar mi respuesta. –

+0

Editado. Sin embargo, algunos de estos requieren cambios específicos. –

0

he intentado mirar a algunos de los nuevos C# cosas en el reflector, para ver si hay algo nuevo por debajo de:

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

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

+1

No probé los tipos dinámicos, pero los parámetros opcionales funcionan bien incluso con .Net 2.0. Lo único que necesita es el compilador VS2010 C#. Quizás incluso la dinámica funcione. Aunque no estoy seguro – Yogesh

+0

No, 'dynamic' necesita el DLR, así como la carpeta C# para eso en' Microsoft.CSharp'. Esos solo vienen en 4.0. –

+1

Los ensamblajes solo vienen en .NET 4.0, pero eso es todo. Solo necesita el compilador, los ensamblajes y, en teoría, debería poder ejecutarlo en CLR 2.0. –

1

Se actualizaron muchos tipos de interfaces y delegados centrales en el CLR para admitir generic covariance and contravariance. Por ejemplo, IEnumerable<T> se ha cambiado a IEnumerable<out T>.

+1

Eso no es CLR (Common Language __Runtime__), eso es BCL (Base Class Library). CLR es la VM. –

+0

Bastante justo. Los cambios en las interfaces comunes fueron actualizaciones BCL para aprovechar una nueva característica en el CLR. –

+0

genérico co y contravariancia se agregaron en .NET 2.0 y han estado disponibles en los idiomas que los admiten (por ejemplo, Eiffel.NET) desde entonces. No es una característica nueva ni en el VES ni en el CLR, es puramente una característica de C#. Si el BCL se escribieron en Eiffel en lugar de C#, esas anotaciones de varianza podrían haberse agregado hace años. (De hecho, podrían haberse agregado con un paso de post-procesamiento de código de bytes o algo así). –