2009-10-26 59 views
21

我已阅读过无数关于C#4.0新功能的博客,文章和StackOverflow问题。即使新的WPF 4.0功能已经开始公开发布。我找不到并且想知道:CLR 2.0和CLR 4.0之间的区别

  1. 从C#/ WPF开发人员角度来看,CLR 4.0有哪些主要更改?
  2. 作为一个整体,CLR 4.0的主要变化是什么?

我认为,在内部,大多数变化都是针对新的动态语言和并行编程。但是还有其他重大改进吗?因为语言改进就是这样,语言改进。你只需要新的编译器,除了版本1.0/1.1(至少其中大部分都可以使用)之外,这些功能可以与更低版本的.Net一起使用。

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

编辑:

由于帕维尔Minaev在评论中指出,即使是那些两个特征是CLR独立。 3.0和3.5也有速度和其他改进。那么为什么版本增量?

+1

CLR直接支持动态语言支持而非并行编程。 DLR支持动态语言,它建立在CLR之上(并且不使用特定的任何东西,并且可以在2.0上运行)。并行FX只是一个库。 – 2009-10-26 18:10:11

回答

11

我知道的一个新的CLR事情是为了​​而对接口,结构和代表进行结构化类型化的一种形式 - 基本上,它允许运行时将不同类型的对等定义视为相同 - 所以如果两个程序集AB均具有在其中声明的具有相同IID和相同成员的COM导入接口IFoo,运行时将它们视为等效类型;所以如果有一个类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演示文稿。它现在可能有点过时,但大多数提到的东西似乎都在beta版中。

+0

@Pavel,为什么你不能在4中捕获这些异常呢?他们是否过时了? – 2010-03-19 17:47:53

+0

它们被故意制造出来,因为应用程序没有合理的理由来捕捉它们。对于'StackOverflowException',这是因为它是任何错误处理代码都无法做得太多的条件(无论如何,如果你没有堆栈,甚至不能进行方法调用......) )。对于'AccessViolationException',这是因为它本质上是非确定性的 - 一种操作会导致一个人也可以很好地读取(或者更糟糕的是,写入)一些不相关的内存区域;所以捕捉它总是一个设计问题。 – 2010-03-19 18:00:33

+2

'AccessViolationException'可能已经变得不可捕捉,因为代码访问安全性已被弃用,这使得该异常不推荐使用:http://www.infoq.com/news/2010/01/CAS-.NET-4.0。它从来不是非确定性的,当然不是在你想允许运行外部代码的地方。 – Abel 2010-04-12 11:13:17

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。)

如果我错了这一点,我很想知道!

+0

必须有一个(107),Reflector一直在抛出异常:) – leppie 2009-10-26 18:22:15

4

有大量的变化。

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

最大的变化可能是更多的库/框架更改,而不是CLR更改。如将DLR整合到框架中,以及新的动态类型。在框架方面,您有反应框架,并行库扩展,代码合同,元组支持以及很多小的更改(即:Enum.TryParse,Lazy<T>以及其他一些小而精彩的改进)。

+3

'dynamic'是一个C#工件,并不是CLR类型。你说的是什么“将DLR整合到CLR中”? DLR实际上只是一个图书馆。 – 2009-10-26 18:12:58

+0

的确,我可以编辑我的答案。 – 2009-10-26 18:14:43

+0

已编辑。不过,其中的一些确实需要进行特定的更改。 – 2009-10-26 18:18:34

0

我试图寻找一些在反射器C#新的东西,要看看有没有下任何新的东西下来:

  • 动态类型转换为对象 S,通过编译器的魔力,它增加了库调用来处理运行时绑定。
  • 可选参数通过编译器处理。如果您调用Foo(int x = 5),而不指定x的值,则您将在Reflector中看到Foo(5)的调用。

所以我想这些变化是你可以轻易发现的东西(就像CLR 2.0中的通用支持)。

+1

我没有尝试过动态类型,但可选参数甚至可以与.Net 2.0一起使用。唯一需要的是VS2010 C#编译器。也许即使动态也可能起作用但不知道。 – Yogesh 2009-10-26 18:53:41

+0

不,'dynamic'需要DLR,以及'Microsoft.CSharp'中的C#binder。那些只有4.0。 – 2009-10-26 23:04:44

+1

程序集只能在.NET 4.0中使用,但就是这样。你只需要编译器,程序集,理论上你应该可以在CLR 2.0上运行它。 – 2009-10-26 23:25:21

1

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

+1

这不是CLR(公共语言__Runtime__),即BCL(基类库)。 CLR是虚拟机。 – 2009-10-26 23:05:18

+0

够公平的。常见接口的更改是BCL更新,以利用CLR中的新功能。 – 2009-10-27 16:36:36

+0

在.NET 2.0中添加了泛型协变和逆变,并且从那以后就有了支持它们的语言(例如Eiffel.NET)。这不是VES和CLR的新功能,它纯粹是C#功能。如果BCL是用Eiffel而不是C#编写的,那么可以在几年前添加这些差异注释。 (事实上​​,他们可能刚刚添加了字节码后处理步骤或类似的东西。) – 2010-11-04 13:44:53

相关问题