1. 程式人生 > >託管程式碼和非託管程式碼

託管程式碼和非託管程式碼

託管程式碼:由公共語言執行庫環境(而不是直接由作業系統)執行的程式碼。託管程式碼應用程式可以獲得公共語言執行庫服務,例如自動垃圾回收、執行庫型別檢查和安全支援等。這些服務幫助提供獨立於平臺和語言的、統一的託管程式碼應用程式行為。

     非託管程式碼:在公共語言執行庫環境的外部,由作業系統直接執行的程式碼。非託管程式碼必須提供自己的垃圾回收、型別檢查、安全支援等服務,它與託管程式碼不同,後者從公共語言執行庫中獲得這些服務,而非託管程式碼是在執行庫之外執行的程式碼。例如COM 元件、ActiveX 介面和 Win32 API 函式都是非託管程式碼的示例。

區別:

     1、託管程式碼是一種中間語言,執行在CLR上;

          非託管程式碼被編譯為機器碼,執行在機器上。

     2、託管程式碼獨立於平臺和語言,能更好的實現不同語言平臺之間的相容;

          非託管程式碼依賴於平臺和語言。

     3、託管程式碼可享受CLR提供的服務(如安全檢測、垃圾回收等),不需要自己完成這些操作;

          非託管程式碼需要自己提供安全檢測、垃圾回收等操作。

 託管程式碼就意味著託管資料?答案是否定的。

      對於Visual Basic和C#來說,生活是簡單的,因為你沒有其它選擇。當你在那些語言裡面宣告一個類,那麼這個類的例項會在託管堆中被建立,垃圾收集器(GC)會幫我們管理這些物件的回收

。但是在Visual C++中,你有另一個選擇。即使你正建立一個託管程式,你可以決定哪些類是託管型別,哪些類是非託管型別的。

這就是非託管型別:

class Foo
{
   private:
      int x;
   public:
      Foo(): x(0){}
      Foo(int xx): x(xx) {}
};

這就是託管型別

__gc class Bar
{
   private:
      int x;
   public:
      Bar(): x(0){}
      Bar(int xx): x(xx) {}
};

      他們唯一的區別就是類Bar的定義中有__gc關鍵字。這個關鍵字會給程式碼帶來巨大的區別。