C#中的CLR和DLR有什么区别?这两个概念是否具有可比性?
答案 0 :(得分:22)
公共语言运行时(CLR)是.NET提供的核心服务集 - 类型系统,JIT,垃圾收集器,& c。这些可用于所有.NET语言,因此是“Common”部分。
Dynamic Language Runtime (DLR)构建于此之上并为动态语言提供服务:动态类型,动态方法调度,代码生成和& c。我们的想法是将这些内容统一起来并在动态语言中共享它们,以便它们可以预测和类似地工作,就像CLR上的内容也适用于所有语言一样。
在某些方面具有可比性,.NET上的“普通”语言使用CLR,动态语言应该使用DLR,但也会使用CLR。它们是设计师认为在各种语言中很常见的基本功能集。 IronPython和IronRuby是在DLR之上实现的,C#4的dynamic
功能也是如此。
答案 1 :(得分:16)
我只需添加一个简单的图表来证明这一点:
"*** Runtime & Libraries ***" │ "*** Languages ***"
┌────────────────────────────────────┤
│ .NET Libraries │
│ ┌────────────────────────────────┼──────────────────┐
│ │ Dynamic Language Runtime (DLR) │ C# 4.0 'dynamic' ├────┐
├───┴────────────────────────────────┼──────────────────┘ │
│ Common Language Runtime (CLR) │ C# 1.0, 2.0, 3.0 │
└────────────────────────────────────┴───────────────────────┘
答案 2 :(得分:7)
DLR运行在CLR之上。 DLR允许C#dynamic
变量和其他动态语言功能。
答案 3 :(得分:7)
为已经给出的优秀答案添加一点清晰度。
首先是CLR,这是一个位于用户代码和物理硬件之间的抽象层。有几个优点:
.Net DLR由Jim Hugunin创建,是
动态语言运行时(DLR)是一个运行时环境,它将动态语言的一组服务添加到公共语言运行库(CLR)。 DLR使开发动态语言更容易在.NET Framework上运行,并为静态类型语言添加动态功能 动态语言可以在运行时识别对象的类型,而在静态类型语言(如C#和Visual Basic)中(当使用Option Explicit On时),您必须在设计时指定对象类型。动态语言的示例有Lisp,Smalltalk,JavaScript,PHP,Ruby,Python,ColdFusion,Lua,Cobra和Groovy。
DLR为CLR添加了一组服务,以便更好地支持动态语言。这些服务包括以下内容: 表达树。 DLR使用表达式树来表示语言语义。为此,DLR扩展了LINQ表达式树以包括控制流,赋值和其他语言建模节点。有关更多信息,请参见表达式树(C#和Visual Basic)。 调用站点缓存。动态调用站点是代码中的一个位置,您可以在动态对象上执行类似+ b或a.b()的操作。 DLR缓存a和b的特征(通常是这些对象的类型)和有关操作的信息。如果先前已执行此类操作,则DLR从高速缓存中检索所有必要信息以便快速分派。 动态对象互操作性。 DLR提供了一组表示动态对象和操作的类和接口,可供语言实现者和动态库的作者使用。这些类和接口包括IDynamicMetaObjectProvider,DynamicMetaObject,DynamicObject和ExpandoObject。 DLR使用呼叫站点中的绑定器不仅可以与.NET Framework进行通信,还可以与其他基础结构和服务(包括Silverlight和COM)进行通信。 Binders封装了语言的语义,并指定了如何使用表达式树在调用站点中执行操作。这使得动态和静态类型语言能够使用DLR共享库并获得对DLR支持的所有技术的访问。
示例
dynamic d = "test";
Console.WriteLine(d.GetType());
// Prints "System.String".
d = 100;
Console.WriteLine(d.GetType());
// Prints "System.Int32".
dynamic d = "test";
// The following line throws an exception at run time.
d++;