代码之家  ›  专栏  ›  技术社区  ›  Yogesh

clr 2.0和clr 4.0之间的差异

  •  22
  • Yogesh  · 技术社区  · 15 年前

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

    1. 从C/WPF开发人员的角度来看,对clr 4.0的主要更改是什么?
    2. 整个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也有速度和其他改进。那么为什么要增加版本呢?

    7 回复  |  直到 13 年前
        1
  •  11
  •   Pavel Minaev    15 年前

    我所知道的一个新的clr是一种为接口、结构和委托进行结构类型化的形式,目的是 NoPIA support -基本上,它允许运行时使用相同的定义来处理不同的类型,就像它们是相同的一样-所以如果两个程序集 A B 每个都有一个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演示文稿。它现在可能有点过时了,但大多数提到的东西似乎都在betas中。

        2
  •  4
  •   Reed Copsey    15 年前

    有很多变化。

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

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

        3
  •  2
  •   Community Ian Goodfellow    7 年前

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

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

    如果我错了,我想知道!

        4
  •  2
  •   Alexandra Rusina    15 年前

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

    这是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

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

        5
  •  1
  •   Joel Mueller    15 年前

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

        7
  •  0
  •   Doron Yaacoby ICR    15 年前

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

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

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