2012-07-23 65 views
4

我在我的C#代码行,为了测量一个字符串的长度创建字体:这个Font对象什么时候被丢弃?

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

我的问题是,当被设置在new Font()变量?它是在处理表单时处理,还是立即处理?

+2

它根本没有处置。 – 2012-07-23 21:28:59

回答

8

Font有终结声明:

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

当字体对象创建的,它是在结束队列注册。这些对象在垃圾收集期间不会被销毁(即分配内存) - 当终结器被调用(btw终结器可能永远不会被执行)时,它们会在后面销毁。因此更好地通过手动或通过using声明致电Dispose声明。在这种情况下的字体对象将被设置,并且从最终确定未登记(因此它将被从存储器垃圾收集过程中被除去):

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

可以了解更多关于无用单元收集和定稿in Jeffrey Richter's article

+1

+1,唯一正确的答案到目前为止,除了当你说“处置”你真的意思是“从内存中删除”。 – 2012-07-23 21:38:04

+0

@KrisVandermotten谢谢:)我在回答中做了一些改进 – 2012-07-23 21:42:41

+1

我不希望这是答案(我想依靠C#GC),但是在做了更多的研究之后([我发现这个](http: //social.msdn.microsoft.com/Forums/is/csharpgeneral/thread/ba9b136c-15b0-42bf-87b6-bdbe38f0b4c7))我相信你是对的。感谢你的回答。 – 2012-07-24 15:59:47

-2

应当设置每当垃圾收集器感觉像。你不应该依赖使用处置,因为你不能保证它很快就会发生。您可以放心,直到完成使用后才会处理它(即在范围内的对象内不存在对它的引用)

+3

不要混淆处置(按需求释放托管资源或无用资源),终结(释放未处理的非托管资源)和垃圾收集(释放内存)。 Finalize被垃圾收集器调用,除非加载,Dispose从不被垃圾收集器调用。 – 2012-07-23 21:34:19

相关问题