CLR 2.0和CLR 4.0之间的区别

时间:2009-10-26 18:07:02

标签: clr .net-4.0 c#-4.0

我已经阅读了无数关于C#4.0新功能的博客,帖子和StackOverflow问题。即使是新的WPF 4.0功能也已经开始公开。我找不到并想知道的事情:

  1. 从C#/ WPF开发人员角度对CLR 4.0进行哪些主要更改?
  2. CLR 4.0作为一个整体有哪些主要变化?
  3. 我认为,在内部,大多数更改都是针对新的动态语言和并行编程。但是还有其他重大改进吗?因为语言改进只是语言的改进。您只需要新的编译器,除了版本1.0 / 1.1(至少大部分都可以使用)之外,这些功能可以与较低版本的.Net一起使用。

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

    编辑:

    正如Pavel Minaev在评论中指出的那样,即使这两个特征也是CLR独立的。 3.0和3.5也有速度和其他改进。那么为什么版本会增加?

7 个答案:

答案 0 :(得分:11)

我知道的一个新的CLR是为了NoPIA support而为接口,结构和委托构造一种结构类型 - 基本上,它允许运行时使用等效的定义来处理不同的类型,就像它们是相同的一样 - 因此,如果两个程序集AB各自在其中声明了COM导入的接口IFoo,具有相同的IID和相同的成员,则运行时将它们视为等效类型;因此,如果有一个实例Foo实现了[A]IFoo,则可以将其强制转换为[B]IFoo,然后投射就可以了。

另一个原因是能够在单个进程中并排托管多个CLR版本。例如,您无法在一个进程中托管1.x和2.0,但您可以托管2.0和4.0。这样做的主要好处是能够同时加载为CLR版本编写的插件。

一个小小的问题是,更多的异常已经变得无法捕捉,例如StackOverflowException在2.0中 - 例如,你不能再抓住AccessViolationException

此外,here是来自PDC 2008的CLR 4.0上的PowerPoint演示文稿。现在可能有点过时,但是那里提到的大多数内容似乎都存在于测试版中。

答案 1 :(得分:4)

有很多变化。

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

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

答案 2 :(得分:2)

我不相信有任何新的IL指令。新的CLR对内联和垃圾收集等内容进行了改进,它们与2.0 CLR完成相同的工作,但效果更好。虚拟机(例如CLR或JVM)是​​具有多种可能实现的抽象概念。我相信CLR 4.0与CLR 2.0中的抽象机器相同,只是改进了实现。

即使是新的动态内容也只是新API的编译技巧(与Java where it's being proposed as a new opcode不同。)

如果我错了,我很想知道!

答案 3 :(得分:2)

对于每个版本,文档团队都会创建“新内容”文档。

以下是C#4.0 Beta2:What's New in Visual C# 2010

这是.NET Framework 4.0 Beta2的版本:What's New in the .NET Framework Version 4

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

答案 4 :(得分:1)

CLR中的许多核心接口和委托类型已更新,以支持generic covariance and contravariance。例如,IEnumerable<T>已更改为IEnumerable<out T>

答案 5 :(得分:1)

答案 6 :(得分:0)

我尝试在Reflector中查看一些新的C#内容,看看下面是否有新内容:

  • 动态类型通过编译器魔术转换为 object ,后者添加库调用以处理运行时绑定。
  • 可选参数通过编译器处理。如果你调用Foo(int x = 5),而没有指定x的值,你会在Reflector中看到调用为Foo(5)。

所以我猜这些变化是你无法轻易发现的(比如CLR 2.0中的通用支持)。