程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> 關於C# >> C#第一講 使用垃圾回收器

C#第一講 使用垃圾回收器

編輯:關於C#
 

內存有限,所以必須在不被占有的時候回收。

方法結束時值類型容易銷毀。引用類型就不同。

析構函數~+類名;垃圾回收時執行任何整理。可以在任何線程上執行。

析構函數的限制:
1.不能在struct上聲明;
2.不能有訪問修飾符例如public;
3.不能帶參數也不能接受參數,所以不可被重載,所以一個類最多一個析構函數;
4.析構函數是被自動調用,不可顯示調用,不可被繼承。
5.析構函數聲明的標識符必須是類名;
6.析構函數聲明包括extern修飾符時稱外部析構函數,不提供任何實際的實現,函數體由一個分號組成。
7.非外部析構函數都都包含一個塊。

任何代碼不再使用某實例時,該實例就符合銷毀條件。
銷毀實例按照從派生程度最大到最小的順序,調用繼承鏈中的各個析構函數。

析構函數實際是重寫了System.Object中的虛方法Finalize.

C#中永遠不能親自摧毀對象

垃圾回收器的保證:
每個對象都被摧毀;
每個對象都只被摧毀一次;
每個對象只有在該對象不存在任何引用才會摧毀;
目的:讓程序員告別麻煩又易出錯的清理工作。

可以調用靜態方法System.GC.Collect()垃圾回收器;
但不建議這麼做;

只有對象垃圾回收時才運行析構函數。含有析構函數的類會使代碼和回收過程復雜影響性能。

更好的方法:
disposal方式--親自釋放
TextReader reader =new StreamReader(filename)
try{
string line;
while((line=reader.ReadLine())!=null)
{Console.Write(line);
}
finally{
reader.Close();
}

但這樣做並不完美:
1.dispose多個資源會變得難以控制。
2.有時要修改代碼(finally塊中的引用不能為null)
3.不能創建解決方案的一個抽象,這意味方案難以理解,而你必須在需要該功能的任何地方重復代碼。
4.對資源的引用保留在finally塊之後的作用域中,這意味著可能不小心試圖使用一個已經釋放的資源。

using就是為解決這些而設計的;
可以將using語句作為一種明確異常安全的可靠的方式來保證一個資源總是被自動釋放。這解決了人工try/finally中存在的問題。
需要dispose多個資源時有良好的擴展性;
不影響程序代碼的邏輯;
對問題進行良好的抽象,避免重復性代碼;
非常可靠;

注意此using非引入命名空間的using.
此using語法是
using(type variable=initialization) embeddedStstement

確保DataReader絕對Close
using(SqlDataReader dr=...)
{
if(dr.HasRows)
{
while(dr.Read())
{...}
}
}

using語句獲取一個或多個資源,執行一個語句,然後處理這些資源。資源是實現IDisposable接口的類或結構。
正在使用資源的代碼可以調用Dispose釋放,如果不調用會由垃圾回收器處理。
using語句聲明的局部變量【只讀,不可ref out】,表達式必須是實現了IDisposable接口或可以隱式轉化為IDisposable的一個類型。

using語句:獲取-使用-處置

從析構函數中調用Dispose方法也許能保證它總是運行。
class Example:IDisposable
~example(){
Dispose();
}
public virtual void Dispose();
{
if(!this.disposed){
try{
//在此釋放稀缺資源
}
finally{
this.disposed=true;
GC.SuppressFinalize(this);
}
}
}
public void SomeBehavior()//示例方法
{
checkifdisposed();
}
...
private void checkifdisposed(){
if(this.disposed)
{
throw new ObjectDisposedException("Example");
}
}
private Resource scarce;
private bool disposed=false;
}
注意
1.類實現了IDisposable
2.析構函數調用Dispose
3.Dispose方法是public可以隨意調用
4.Dispose方法可以安全的多次調用。變量disposed指出方法以前是否運行過,只有第一次運行才會釋放稀缺資源
5.Dispose方法調用靜態的GC.SuppressFinalize方法。該方法防止垃圾回收器在這個對象上調用析構函數,因為對象現在已經finalized
6.類的所有常規方法都要檢查對象是否disposed如果是就拋出異常
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved