这个字体对象何时被销毁?

4

我的C#代码中有一行创建字体以测量字符串长度的代码:

int width = (int)(myGraphics.MeasureString(text, new Font(myFontName, myFontSize, FontStyle.Bold)).Width);

我的问题是,new Font() 变量何时被释放?它是在窗体被释放时释放,还是立即释放?
2个回答

8

Font 声明了 finalizer:

~Font()
{
    this.Dispose(false);
}

当字体对象被创建时,它会在终结器队列中注册。这样的对象在垃圾回收期间不会被销毁(即内存仍然保留),它们在稍后调用终结器时才被销毁(顺便说一下,终结器可能永远不会执行)。因此最好手动调用Dispose或通过using语句来调用。在这种情况下,字体对象将被处理并从终结器中注销(因此它将在垃圾回收期间从内存中删除):

public void Dispose()
{
    this.Dispose(true);
    GC.SuppressFinalize(this);
}

你可以在 Jeffrey Richter 的文章中了解更多关于垃圾回收和终结的知识。点击这里阅读


1
+1,到目前为止唯一正确的答案,除了当你说“disposed”时,你真正意思是“从内存中移除”。 - Kris Vandermotten
@KrisVandermotten 谢谢 :) 我对答案进行了一些改进 - Sergey Berezovskiy
1
我并不希望这是答案(我想依赖于C#GC),但在做了更多研究后(我找到了这个链接:http://social.msdn.microsoft.com/Forums/is/csharpgeneral/thread/ba9b136c-15b0-42bf-87b6-bdbe38f0b4c7),我相信你是正确的。感谢您的回答。 - John Leehey

-2

它将在垃圾回收器感觉合适时被处理。你不应该过度依赖dispose,因为你无法保证它会很快发生。但是你可以放心,只要你使用完毕(即在范围内的对象中不存在对它的引用),它就不会被处理。


3
不要混淆处理(按需释放托管或非托管资源)、终结(释放未被处理的非托管资源)和垃圾回收(释放内存)。除非禁止,否则终结由垃圾回收器调用,Dispose 永远不会被垃圾回收器调用。 - Kris Vandermotten

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接