日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用垃圾回收器-转

發(fā)布時間:2025/5/22 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用垃圾回收器-转 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

內(nèi)存有限,所以必須在不被占有的時候回收。

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

析構(gòu)函數(shù)~+類名;垃圾回收時執(zhí)行任何整理。可以在任何線程上執(zhí)行。

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

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

析構(gòu)函數(shù)實(shí)際是重寫了System.Object中的虛方法Finalize.

C#中永遠(yuǎn)不能親自摧毀對象

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

可以調(diào)用靜態(tài)方法System.GC.Collect()垃圾回收器;
但不建議這么做;

只有對象垃圾回收時才運(yùn)行析構(gòu)函數(shù)。含有析構(gòu)函數(shù)的類會使代碼和回收過程復(fù)雜影響性能。

更好的方法:
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.不能創(chuàng)建解決方案的一個抽象,這意味方案難以理解,而你必須在需要該功能的任何地方重復(fù)代碼。
4.對資源的引用保留在finally塊之后的作用域中,這意味著可能不小心試圖使用一個已經(jīng)釋放的資源。

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

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

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

using語句獲取一個或多個資源,執(zhí)行一個語句,然后處理這些資源。資源是實(shí)現(xiàn)IDisposable接口的類或結(jié)構(gòu)。
正在使用資源的代碼可以調(diào)用Dispose釋放,如果不調(diào)用會由垃圾回收器處理。
using語句聲明的局部變量【只讀,不可ref out】,表達(dá)式必須是實(shí)現(xiàn)了IDisposable接口或可以隱式轉(zhuǎn)化為IDisposable的一個類型。

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

從析構(gòu)函數(shù)中調(diào)用Dispose方法也許能保證它總是運(yùn)行。
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.類實(shí)現(xiàn)了IDisposable
2.析構(gòu)函數(shù)調(diào)用Dispose
3.Dispose方法是public可以隨意調(diào)用
4.Dispose方法可以安全的多次調(diào)用。變量disposed指出方法以前是否運(yùn)行過,只有第一次運(yùn)行才會釋放稀缺資源
5.Dispose方法調(diào)用靜態(tài)的GC.SuppressFinalize方法。該方法防止垃圾回收器在這個對象上調(diào)用析構(gòu)函數(shù),因?yàn)閷ο蟋F(xiàn)在已經(jīng)finalized
6.類的所有常規(guī)方法都要檢查對象是否disposed如果是就拋出異常

轉(zhuǎn)載于:https://www.cnblogs.com/whitetiger/archive/2007/03/25/687579.html

總結(jié)

以上是生活随笔為你收集整理的使用垃圾回收器-转的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。