我已经阅读了无数关于C#4.0新功能的博客,帖子和StackOverflow问题。即使是新的WPF 4.0功能也已经开始公开。我找不到并想知道的事情:
我认为,在内部,大多数更改都是针对新的动态语言和并行编程。但是还有其他重大改进吗?因为语言改进只是语言的改进。您只需要新的编译器,除了版本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也有速度和其他改进。那么为什么版本会增加?
答案 0 :(得分:11)
我知道的一个新的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演示文稿。现在可能有点过时,但是那里提到的大多数内容似乎都存在于测试版中。
答案 1 :(得分:4)
有很多变化。
在CLR本身中,有一些变化。正在更改垃圾收集器以支持在工作站模式下并发收集gen0 / 1和gen2。此外,安全性的实施方式也有一些变化。并行框架改变了一些CLR的线程池实现(它不是完全托管的,而是运行时本身的一部分)。此外,类型系统也有一些变化,主要与新的PIA COM支持有关。
最大的变化可能是更多的库/框架更改,而不是CLR更改。例如将DLR集成到框架中,以及新的动态类型。在框架方面,你有反应式框架,并行库扩展,代码契约,元组支持和许多小变化(即:Enum.TryParse
,Lazy<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)
以下是CLR 4.0中的更改
答案 6 :(得分:0)
我尝试在Reflector中查看一些新的C#内容,看看下面是否有新内容:
所以我猜这些变化是你无法轻易发现的(比如CLR 2.0中的通用支持)。