❶ 如何理解C#中 託管與非託管 可以通俗的說明下麽
託管,及.net framework 負責幫你管理內存及資源釋放,不需要自己控制。
非託管,需要明確的釋放系統資源(內存)等操作。比如你讀取文件,之後需要對各種Stream進行Close等操作。比如 SqlDataReader 讀取數據完畢之後,需要 reader.close();等
❷ 託管類型與非託管類型的轉換c#代碼。。。
託管類型(准確地說是託管資源)與非託管類型之間的區別在於前者有clr的垃圾回收期統一回收,不需要顯示聲明回收代碼。非託管資源需要顯示調用回收代碼來釋放佔用的資源。
例如int、DateTime等資源都是託管資源,StreamReader、SqlConnection等是非託管資源。
❸ C# 託管資源與非託管資源
我是這樣理解的:可以由系統自動回收的資源就叫託管資源,不能自動回收的叫非託管資源。
比如C++的資源都是非託管 ,因為你要自己寫析構函數來釋放資源。
C# 中引入了類似 Java的gc功能,即垃圾自動回收。所以所以你寫的方法就不用自己寫析構了,系統會自動回收不再使用的資源。C# 中 的飛託管資源 是由於程序員 引入了 不安全的代碼 或代碼段,CLR 無法驗證其安全性,也就無法託管。比如 在unsafe 下的代碼或代碼段 都是非託管的。
期待更明了的解釋···
❹ 什麼是託管、非託管
可以理解為所有.net程序的環境支持,或說運行環境。
詳細解釋:
NET Framework 是一種新的計算平台,它簡化了在高度分布式 Internet 環境中的應用程序開發。.NET Framework 旨在實現下列目標:
提供一個一致的面向對象的編程環境,而無論對象代碼是在本地存儲和執行,還是在本地執行但在 Internet 上分布,或者是在遠程執行的。
提供一個將軟體部署和版本控制沖突最小化的代碼執行環境。
提供一個保證代碼(包括由未知的或不完全受信任的第三方創建的代碼)安全執行的代碼執行環境。
提供一個可消除腳本環境或解釋環境的性能問題的代碼執行環境。
使開發人員的經驗在面對類型大不相同的應用程序(如基於 Windows 的應用程序和基於 Web 的應用程序)時保持一致。
按照工業標准生成所有通信,以確保基於 .NET Framework 的代碼可與任何其他代碼集成。
.NET Framework 具有兩個主要組件:公共語言運行庫和 .NET Framework 類庫。公共語言運行庫是 .NET Framework 的基礎。您可以將運行庫看作一個在執行時管理代碼的代理,它提供核心服務(如內存管理、線程管理和遠程處理),而且還強制實施嚴格的類型安全以及可確保安全性和可靠性的其他形式的代碼准確性。事實上,代碼管理的概念是運行庫的基本原則。以運行庫為目標的代碼稱為託管代碼,而不以運行庫為目標的代碼稱為非託管代碼。.NET Framework 的另一個主要組件是類庫,它是一個綜合性的面向對象的可重用類型集合,您可以使用它開發多種應用程序,這些應用程序包括傳統的命令行或圖形用戶界面 (GUI) 應用程序,也包括基於 ASP.NET 所提供的最新創新的應用程序(如 Web 窗體和 XML Web services)。
.NET Framework 可由非託管組件承載,這些組件將公共語言運行庫載入到它們的進程中並啟動託管代碼的執行,從而創建一個可以同時利用託管和非託管功能的軟體環境。.NET Framework 不但提供若干個運行庫宿主,而且還支持第三方運行庫宿主的開發。
例如,ASP.NET 承載運行庫以為託管代碼提供可伸縮的伺服器端環境。ASP.NET 直接使用運行庫以啟用 ASP.NET 應用程序和 XML Web services(本主題稍後將對這兩者進行討論)。
Internet Explorer 是承載運行庫(以 MIME 類型擴展的形式)的非託管應用程序的一個示例。使用 Internet Explorer 承載運行庫使您能夠在 HTML 文檔中嵌入託管組件或 Windows 窗體控制項。以這種方式承載運行庫使得託管移動代碼(類似於 Microsoft® ActiveX® 控制項)成為可能,但是它具有隻有託管代碼才能提供的重大改進(如不完全受信任的執行和安全的獨立文件存儲)。
❺ 託管和非託管是什麼意思
託管代碼 (managed code) :由公共語言運行庫環境(而不是直接由操作系統)執行的代碼。託管代碼應用程序可以獲得公共語言運行庫服務,例如自動垃圾回收、運行庫類型檢查和安全支持等。這些服務幫助提供獨立於平台和語言的、統一的託管代碼應用程序行為。 Unmanaged Code - 非託管代碼 :在公共語言運行庫環境的外部,由操作系統直接執行的代碼。非託管代碼必須提供自己的垃圾回收、類型檢查、安全支持等服務;它與託管代碼不同,後者從公共語言運行庫中獲得這些服務。非託管代碼的英文名是Unmanaged Code ,它是在公共語言運行庫環境的外部,由操作系統直接執行的代碼。
❻ C#中使用託管資源和非託管資源的區別,以
託管資源指的是.NET可以自動進行回收的資源,主要是指託管堆上分配的內存資源。託管資源的回收工作是不需要人工干預的,有.NET運行庫在合適調用垃圾回收器進行回收。
非託管資源指的是.NET不知道如何回收的資源,最常見的一類非託管資源是包裝操作系統資源的對象,例如文件,窗口,網路連接,資料庫連接,畫刷,圖標等。這類資源,垃圾回收器在清理的時候會調用Object.Finalize()方法。默認情況下,方法是空的,對於非託管對象,需要在此方法中編寫回收非託管資源的代碼,以便垃圾回收器正確回收資源。
在.NET中,Object.Finalize()方法是無法重載的,編譯器是根據類的析構函數來自動生成Object.Finalize()方法的,所以對於包含非託管資源的類,可以將釋放非託管資源的代碼放在析構函數。
注意,不能在析構函數中釋放託管資源,因為析構函數是有垃圾回收器調用的,可能在析構函數調用之前,類包含的託管資源已經被回收了,從而導致無法預知的結果。
本來如果按照上面做法,非託管資源也能夠由垃圾回收器進行回收,但是非託管資源一般是有限的,比較寶貴的,而垃圾回收器是由CRL自動調用的,這樣就無法保證及時的釋放掉非託管資源,因此定義了一個Dispose()方法,讓使用者能夠手動的釋放非託管資源。Dispose()方法釋放類的託管資源和非託管資源,使用者手動調用此方法後,垃圾回收器不會對此類實例再次進行回收。Dispose()方法是由使用者調用的,在調用時,類的託管資源和非託管資源肯定都未被回收,所以可以同時回收兩種資源。
Microsoft為非託管資源的回收專門定義了一個介面:IDisposable,介面中只包含一個Dispose()方法。任何包含非託管資源的類,都應該繼承此介面。
在一個包含非託管資源的類中,關於資源釋放的標准做法是:
(1) 繼承IDisposable介面;
(2) 實現Dispose()方法,在其中釋放託管資源和非託管資源,並將對象本身從垃圾回收器中移除(垃圾回收器不在回收此資源);
(3) 實現類析構函數,在其中釋放非託管資源。
在使用時,顯示調用Dispose()方法,可以及時的釋放資源,同時通過移除Finalize()方法的執行,提高了性能;如果沒有顯示調用Dispose()方法,垃圾回收器也可以通過析構函數來釋放非託管資源,垃圾回收器本身就具有回收託管資源的功能,從而保證資源的正常釋放,只不過由垃圾回收器回收會導致非託管資源的未及時釋放的浪費。
在.NET中應該盡可能的少用析構函數釋放資源。在沒有析構函數的對象在垃圾處理器一次處理中從內存刪除,但有析構函數的對象,需要兩次,第一次調用析構函數,第二次刪除對象。而且在析構函數中包含大量的釋放資源代碼,會降低垃圾回收器的工作效率,影響性能。所以對於包含非託管資源的對象,最好及時的調用Dispose()方法來回收資源,而不是依賴垃圾回收器。
上面就是.NET中對包含非託管資源的類的資源釋放機制,只要按照上面要求的步驟編寫代碼,類就屬於資源安全的類。
下面用一個例子來總結一下.NET非託管資源回收機制:
Public class BaseResource:IDisposable
{
PRivate IntPtr handle; // 句柄,屬於非託管資源
Private Componet comp; // 組件,託管資源
Private bool isDisposed = false; // 是否已釋放資源的標志
PublicBaseResource
{
}
//實現介面方法
//由類的使用者,在外部顯示調用,釋放類資源
Publicvoid Dispose()
{
Dispose(true);// 釋放託管和非託管資源
//將對象從垃圾回收器鏈表中移除,
// 從而在垃圾回收器工作時,只釋放託管資源,而不執行此對象的析構函數
GC.SuppressFinalize(this);
}
//由垃圾回收器調用,釋放非託管資源
~BaseResource()
{
Dispose(false);// 釋放非託管資源
}
//參數為true表示釋放所有資源,只能由使用者調用
//參數為false表示釋放非託管資源,只能由垃圾回收器自動調用
//如果子類有自己的非託管資源,可以重載這個函數,添加自己的非託管資源的釋放
//但是要記住,重載此函數必須保證調用基類的版本,以保證基類的資源正常釋放
Protectedvirtual void Dispose(bool disposing)
{
If(!this.disposed)// 如果資源未釋放 這個判斷主要用了防止對象被多次釋放
{
If(disposing)
{
Comp.Dispose();// 釋放託管資源
}
closeHandle(handle);// 釋放非託管資源
handle= IntPtr.Zero;
}
this.disposed= true; // 標識此對象已釋放
}
}析構函數只能由垃圾回收器調用。
Despose()方法只能由類的使用者調用。
在C#中,凡是繼承了IDisposable介面的類,都可以使用using語句,從而在超出作用域後,讓系統自動調用Dispose()方法。一個資源安全的類,都實現了IDisposable介面和析構函數。
提供手動釋放資源和系統自動釋放資源的雙保險。
❼ 什麼是託管,什麼是非託管
可以理解為所有.net程序的環境支持,或說運行環境。
詳細解釋:
NET Framework 是一種新的計算平台,它簡化了在高度分布式 Internet 環境中的應用程
序開發。.NET Framework 旨在實現下列目標:
提供一個一致的面向對象的編程環境,而無論對象代碼是在本地存儲和執行,還是在本地
執行但在 Internet 上分布,或者是在遠程執行的。
提供一個將軟體部署和版本控制沖突最小化的代碼執行環境。
提供一個保證代碼(包括由未知的或不完全受信任的第三方創建的代碼)安全執行的代碼
執行環境。
提供一個可消除腳本環境或解釋環境的性能問題的代碼執行環境。
使開發人員的經驗在面對類型大不相同的應用程序(如基於 Windows 的應用程序和基於
Web 的應用程序)時保持一致。
按照工業標准生成所有通信,以確保基於 .NET Framework 的代碼可與任何其他代碼集成
。
.NET Framework 具有兩個主要組件:公共語言運行庫和 .NET Framework 類庫。公共語
言運行庫是 .NET Framework 的基礎。您可以將運行庫看作一個在執行時管理代碼的代理
,它提供核心服務(如內存管理、線程管理和遠程處理),而且還強制實施嚴格的類型安
全以及可確保安全性和可靠性的其他形式的代碼准確性。事實上,代碼管理的概念是運行
庫的基本原則。以運行庫為目標的代碼稱為託管代碼,而不以運行庫為目標的代碼稱為非
託管代碼。.NET Framework 的另一個主要組件是類庫,它是一個綜合性的面向對象的可
重用類型集合,您可以使用它開發多種應用程序,這些應用程序包括傳統的命令行或圖形
用戶界面 (GUI) 應用程序,也包括基於 ASP.NET 所提供的最新創新的應用程序(如 Web
窗體和 XML Web services)。
.NET Framework 可由非託管組件承載,這些組件將公共語言運行庫載入到它們的進程中
並啟動託管代碼的執行,從而創建一個可以同時利用託管和非託管功能的軟體環境。.NET
Framework 不但提供若干個運行庫宿主,而且還支持第三方運行庫宿主的開發。
例如,ASP.NET 承載運行庫以為託管代碼提供可伸縮的伺服器端環境。ASP.NET 直接使用
運行庫以啟用 ASP.NET 應用程序和 XML Web services(本主題稍後將對這兩者進行討論
)。
Internet Explorer 是承載運行庫(以 MIME 類型擴展的形式)的非託管應用程序的一個
示例。使用 Internet Explorer 承載運行庫使您能夠在 HTML 文檔中嵌入託管組件或
Windows 窗體控制項。以這種方式承載運行庫使得託管移動代碼(類似於 Microsoft®
ActiveX® 控制項)成為可能,但是它具有隻有託管代碼才能提供的重大改進(如不完全受
信任的執行和安全的獨立文件存儲)。
❽ 請詳細介紹一下在C#語言中什麼是「非託管資源」,什麼是「託管資源」。
所謂非託管資源是你通過P/Invoke之類方法得到的os資源,CLR沒有辦法幫你釋放這些資源。如果你對這些資源提供了包裝WrapSource。那麼這個WrapSource是託管資源了.他可能管理了非託管資源。但他自己是託管的。
❾ 關於C#的close()方法
一:什麼是資源
在開始本文前,需要一些准備知識。首先要提出「什麼是資源」。在CLR出來之後,Windows系統資源開始分為「非託管資源」和「託管資源」。
非託管資源是指:所有的Window內核對象(句柄)都是非託管資源,如對於Stream,資料庫連接,GDI+的相關對象,還有Com對象等等,這些資源並不是受到CLR管理;
託管資源是指:由CLR管理分配和釋放的資源,即由CLR里new出來的對象。
其次再來講,資源的釋放方式。
非託管資源:需要顯式釋放的,也即需要你寫代碼釋放;
託管資源:並不需要顯式釋放,但是如果引用類型本身含有非託管資源,則需要進行現實釋放;
二:顯式釋放的C#實現
顯式釋放的C#實現,由C#語法支持的有:
1:實現IDisposable介面的Dispose方法;
2:析構方法(終結器);
不由C#語法支持,但是約定支持的顯式釋放是:
3:提供顯示釋放方法,比如常用的Close方法;
三:Dispose、Close和析構方法異同點
但是,還需要區分這3種方式的異同點。首先,你無法調用析構方法。析構方法是由垃圾回收機制進行調用的。換句話來說,就是你不知道析構方法被調用的時機。嚴格意義上來說,它只是作為資源釋放的一個補救措施。
資源釋放的一個正確的措施是為類型實現IDisposable介面的Dispose。當你需要釋放類型的資源的時候,應該顯示的調用Dipose方法。當然,這里還有一個C#的語法糖,就是使用using程序塊,在離開using程序塊的時候,CLR會自動調用類型所創建對象的Dipose方法。
可能有人會問道,既然可以通過Dispose方法的方式來進行資源的釋放,為什麼有些類型還需要提供一個Close方法。這裡面的區別,或者說約定在於,如果你仔細觀察這些類型:他們基本都只公開了Close方法,他們都實現了IDisposable,但都隱藏了Dispose方法。以Socket這個類為例,它:
1:提供public void Close()
public void Close()
{
//….
((IDisposable)this).Dispose();
//….
}
2:提供顯式void IDisposable.Dispose()
void IDisposable.Dispose()
{
this.Dispose(true);
GC.SuppressFinalize(this);
}
3:提供protected virtual void Dispose(bool disposing)。真正的資源釋放的代碼放在這里。
所以理論上來將,提供Close方法最終還是使用的Dispose方法,之所以這么做,是因為這些類型出於顯式實現IDisposable的因素,在調用這些Dispose方法的時候,必須完成一次轉型,如:
((IDisposable)new A()).Dispose();
為了避免轉型,同時也為了避免不熟悉C#語法的開發人員更直觀的釋放資源,提供了Close方法。
在上文的例子中,你可能已經注意到IDisposable.Dispose這個方法中,包含一句:
GC.SuppressFinalize(this);
這是告訴CLR,在進行垃圾回收的時候,不用再繼續調用析構方法(終結器)了。是的,因為你已經手動釋放資源了。這也從另一個方面驗證了析構方法只是作為資源釋放的補救機制。因為假設你忘記Close或者Dispose了,CLR會在垃圾回收的時候為你做這件事。查看Socket的析構函數,你會很好的理解這一點。
~Socket()
{
this.Dispose(false);
}
是的,析構方法調用的也是Dispose。
備注1:本文帶來幾個爭論
1:託管資源本身是否需要顯式釋放。答案顯然是:不需要;
2:如果引用類型對象不再需要,是否需要顯式=null;答案是:即使不這樣做,GC也會進行垃圾回收。
3:將託管資源分為引用類型資源和值類型資源這種分類方法是有問題的,或者說是錯誤的。正確的分類法應該是棧資源和堆資源。線程棧中存放的是方法的實參和方法內部的局部變數。堆上存放的是類型對象本身及對象的兩個額外成員:類型對象指針和同步塊索引。
4:Dispose方法本身是用來讓你放置資源清理代碼的。顯然,一個空方法並不代表清理工作本身,真正執行清理工作的是你具體的代碼。
備注2:推薦Dipose模式實現
如:基類
代碼
class ClassShouldDisposeBase : IDisposable
{
public void Dispose()
{
this.Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
//執行基本的清理代碼
}
}
~ClassShouldDisposeBase()
{
this.Dispose(false);
}
}
子類:
代碼
class ClassShouldDispose: ClassShouldDisposeBase
{
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
// 執行子類清理代碼
// 如有必要,執行base.Dispose(disposing);
}
else
{
// 如有必要,執行base.Dispose(disposing);
}
}
public void Close()
{
//調用本類或者基類的Dispose方法
//其它代碼
}
}
❿ c#讀取文件是在託管堆還是非託管
其實分辨C#託管和非託管資源的方式很簡單,只需要看這些資源是否需要手動回收就行了。
對於非託管資源,在應用程序中使用完這些非託管資源之後,必須顯示的釋放他們。
比如:文件讀取,資料庫鏈接讀取,網路資源鏈接讀取都需要在執行完畢之後手動調用類似Close()的方法來釋放資源,這就是非託管資源的標志