关于.net 4.0:CLR 2.0和CLR 4.0之间的区别

Difference between CLR 2.0 and CLR 4.0

我读过无数关于C 4.0新特性的博客、文章和StackOverflow问题。甚至新的WPF 4.0特性也开始公开。我找不到并且想知道的是:

  • 从C/WPF开发人员的角度来看,对clr 4.0的主要更改是什么?
  • 整个clr 4.0的主要变化是什么?
  • 我认为,在内部,大多数变化是针对新的动态语言和并行编程的。但是还有其他的主要改进吗?因为语言的改进就是语言的改进。您只需要新的编译器,这些功能可以与较低版本的.NET一起使用,除了版本1.0/1.1(至少可以使用其中的大部分)。

    如果以上功能是唯一的,那么只有这些功能的版本才改为4.0,我认为是4.0,因为它是基于.NET 4.0版本(即1.0/1.1、2.0&3.0/3.5之后)。版本增量是否合理?

    编辑:

    正如PavelMinaev在评论中指出的,即使这两个特性都是独立于CLR的。3.0和3.5也有速度和其他改进。那么为什么要增加版本呢?


    我所知道的一个新的clr事情是,为了支持nopia,接口、结构和委托的一种结构类型——基本上,它允许运行时使用相同的定义来处理不同的类型——因此,如果两个程序集AB都有一个com导入的接口IFoo声明d在它们中,具有相同的IID和相同的成员,运行时将它们视为等价的类型;因此,如果有一个实例,某个类Foo实现[A]IFoo时,可以将它强制转换到[B]IFoo中,强制转换将起作用。

    另一件事是能够在一个进程中并行承载多个CLR版本。例如,不能在一个进程中承载1.x和2.0,但可以承载2.0和4.0。这样做的主要好处是能够同时加载为任意一个clr版本编写的插件。

    一个小问题是,更多的例外情况已经变得无法弥补,比如说,StackOverflowException是在2.0版本中,你再也无法捕获AccessViolationException

    此外,这里还有一个来自pdc 2008的关于clr 4.0的PowerPoint演示。它现在可能有点过时了,但大多数提到的东西似乎都在betas中。


    有很多变化。

    在CLR本身中,有一些更改。正在更改垃圾收集器,以支持在工作站模式下同时收集gen0/1和gen2。此外,安全性的实现方式也发生了一些变化。并行框架改变了一些clr对threadpool的实现(它不是完全被管理的,而是运行时本身的一部分)。此外,类型系统也发生了一些变化,主要与新的PIA COM支持有关。

    最大的变化可能是更多的库/框架更改,而不是clr更改。例如,将DLR集成到框架中,以及新的动态类型。在框架方面,您有反应式框架、并行库扩展、代码契约、元组支持,以及许多小的更改(例如:Enum.TryParseLazy和大量其他小的但不错的改进)。


    对于每个发布文档,团队创建"新增内容"文档。

    下面是C 4.0 Beta2的一个:Visual C 2010的新功能

    这里是.NET Framework 4.0 Beta2的版本:在.NET Framework版本4中的新功能

    这些是您可以找到的最完整的更改列表。


    我不相信有任何新的IL指令。新的clr对诸如内联和垃圾收集之类的东西进行了改进,这些改进与2.0 clr执行相同的工作,但效果更好。虚拟机(如clr或jvm)是一个具有多个可能实现的抽象概念。我相信clr 4.0和clr 2.0是同一个抽象机,只是有一个改进的实现。

    即使是新的动态的东西也只是一个新API的编译技巧(不像Java,它被提出为一个新的操作码)。

    如果我错了,我想知道!


    下面是clr 4.0中的更改

    • 新安全模型
    • 垃圾收集器改进
    • 改进了TPL的线程池
    • 改进生产诊断
    • 一般协方差和反方差
    • PIA COM支持的类型系统更改
    • 新GAC

    clr中的许多核心接口和委托类型都已更新,以支持通用协方差和逆变。例如,IEnumerable改为IEnumerable


    我试着看了一下反射镜里的一些新的C材料,看看下面有没有什么新的东西:

    • 动态类型通过编译器magic转换为对象,编译器magic添加库调用以处理运行时绑定。
    • 可选参数通过编译器处理。如果调用foo(int x=5),而不指定x的值,则在Reflector中会看到调用为foo(5)。

    所以我猜这些变化是你很容易发现的(比如clr 2.0中的通用支持)。