我在我的C#代碼行,爲了測量一個字符串的長度創建字體:這個Font對象什麼時候被丟棄?
int width = (int)(myGraphics.MeasureString(text, new Font(myFontName, myFontSize, FontStyle.Bold)).Width);
我的問題是,當被設置在new Font()
變量?它是在處理表單時處理,還是立即處理?
我在我的C#代碼行,爲了測量一個字符串的長度創建字體:這個Font對象什麼時候被丟棄?
int width = (int)(myGraphics.MeasureString(text, new Font(myFontName, myFontSize, FontStyle.Bold)).Width);
我的問題是,當被設置在new Font()
變量?它是在處理表單時處理,還是立即處理?
Font
有終結聲明:
~Font()
{
this.Dispose(false);
}
當字體對象創建的,它是在結束隊列註冊。這些對象在垃圾收集期間不會被銷燬(即分配內存) - 當終結器被調用(btw終結器可能永遠不會被執行)時,它們會在後面銷燬。因此更好地通過手動或通過using
聲明致電Dispose
聲明。在這種情況下的字體對象將被設置,並且從最終確定未登記(因此它將被從存儲器垃圾收集過程中被除去):
public void Dispose()
{
this.Dispose(true);
GC.SuppressFinalize(this);
}
可以瞭解更多關於無用單元收集和定稿in Jeffrey Richter's article
+1,唯一正確的答案到目前爲止,除了當你說「處置」你真的意思是「從內存中刪除」。 – 2012-07-23 21:38:04
@KrisVandermotten謝謝:)我在回答中做了一些改進 – 2012-07-23 21:42:41
我不希望這是答案(我想依靠C#GC),但是在做了更多的研究之後([我發現這個](http: //social.msdn.microsoft.com/Forums/is/csharpgeneral/thread/ba9b136c-15b0-42bf-87b6-bdbe38f0b4c7))我相信你是對的。感謝你的回答。 – 2012-07-24 15:59:47
應當設置每當垃圾收集器感覺像。你不應該依賴使用處置,因爲你不能保證它很快就會發生。您可以放心,直到完成使用後纔會處理它(即在範圍內的對象內不存在對它的引用)
不要混淆處置(按需求釋放託管資源或無用資源),終結(釋放未處理的非託管資源)和垃圾收集(釋放內存)。 Finalize被垃圾收集器調用,除非加載,Dispose從不被垃圾收集器調用。 – 2012-07-23 21:34:19
它根本沒有處置。 – 2012-07-23 21:28:59