C#中CLR和DLR有什麼區別?這兩個概念可比嗎?C#中CLR和DLR有什麼區別?
回答
公共語言運行庫(CLR)的核心是一套由.NET提供的服務 - 一個類型系統,JIT,垃圾收集,&℃。這些都可用於所有.NET語言,因此是「通用」部分。
Dynamic Language Runtime (DLR)建立在此之上,並提供動態語言服務:動態類型,動態方法調度,代碼生成,& c。我們的想法是將這些事情統一起來,並在動態語言之間共享它們,以便它們可預測和類似地工作,就像CLR上的事物也跨越所有語言一樣。
通過某種方式,那些.NET上的「正常」語言使用CLR,動態語言應該使用DLR,但也會使用CLR。它們是設計師認爲在跨語言通用時很好的基本功能集。 IronPython和IronRuby在DLR上實現,C#4的dynamic
功能也是如此。
DLR在CLR上運行。 DLR允許C#dynamic
變量和其他動態語言功能。
我只添加一個簡單的圖來證明這一點:
"*** Runtime & Libraries ***" │ "*** Languages ***"
┌────────────────────────────────────┤
│ .NET Libraries │
│ ┌────────────────────────────────┼──────────────────┐
│ │ Dynamic Language Runtime (DLR) │ C# 4.0 'dynamic' ├────┐
├───┴────────────────────────────────┼──────────────────┘ │
│ Common Language Runtime (CLR) │ C# 1.0, 2.0, 3.0 │
└────────────────────────────────────┴───────────────────────┘
只是平添幾分清晰度到已經給優秀的答案。
首先CLR,這是一個位於用戶代碼和物理硬件之間的抽象層。有幾個優點:
- 硬件獨立性2.通用類型系統3.語言的互操作性
在.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)進行通信。綁定器封裝語言的語義,並指定如何使用表達式樹在調用站點中執行操作。這使得動態和靜態類型的語言能夠使用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++;
- 1. Visual Studio C++ - 'CLR'和'General'類別有什麼區別?
- 2. Silverlight 2中DLR語言和C#之間的速度有什麼區別?
- 3. printf中%c和%C有什麼區別?
- 4. C++中fprintf和vfprintf有什麼區別?
- 5. C++中0x和'\ x'有什麼區別?
- 6. C++中#import和#include有什麼區別?
- 7. C中#define和'='有什麼區別?
- 8. C#中ArrayList和Hashtable有什麼區別?
- 9. 什麼區別\\。\ C:和\\。\ C:\
- 10. char [] c和char c []有什麼區別?
- 11. Managed C++和C++/CLI有什麼區別?
- 12. Visual C++和C++有什麼區別?
- 13. \ c和\\ c有什麼區別?
- 14. c#和visual c#有什麼區別?
- 15. 託管C++和C#有什麼區別?
- 16. C++和C++ CLI有什麼區別
- 17. 有什麼區別`和$(Bash中有什麼區別?
- 18. CLR Worker線程和Worker線程有什麼區別?
- 19. windows線程池和CLR線程池有什麼區別
- 20. 有什麼區別C#
- 21. SqlCeConnection和SqlConnection C#有什麼區別?
- 22. Objective-C和Cocoa有什麼區別?
- 23. Lua C API:lua_gettop()和-1有什麼區別?
- 24. jni compile cpp和c有什麼區別?
- 25. 'b'和'c'有什麼區別?
- 26. Ctrl-C和SIGINT有什麼區別?
- 27. C和%之間有什麼區別?
- 28. Ctrl + C和Ctrl + [有什麼區別?
- 29. C#和.NET有什麼區別?
- 30. GLSL和c有什麼區別?
獲取圖右側是比我想:-) – 2010-11-15 12:43:58
@Joey,斷鏈更難 – James 2017-07-20 23:45:26