我今天早些时候问了一个问题,但我认为我需要以一种不同的方式来解决这个问题(最重要的是,DataSet出现了“挂断”)。
这是一个封装Font的创建的类(换句话说,它是从xml文件读取数据并在运行时根据从该文件读取的内容创建字体):
public class FontCreator
{
private Font m_TheFont = null;
public FontCreator( ... some parameters ... )
{
m_TheFont = GetTheFont();
}
public Font TheFont
{
return m_TheFont;
}
private Font GetTheFont()
{
// code, and more code, that eventually leads to:
Font f = new Font(fntFamily, fntSize, fntStyle);
return f;
}
}
FontCreator类的使用者类似于:
public class TheConsumer()
{
private FontCreator m_FontCreator = null;
public TheConsumer()
{
m_FontCreator = new m_FontCreator( ... some parameters ... );
Initialize();
}
private void Initialize()
{
InitializeThis();
InitializeThat();
}
private void InitializeThis()
{
.... some code ...
SomeObject.ApplyFont(m_FontCreator.TheFont);
}
private void InitializeThat()
{
... some code ...
SomeObject.ApplyFont(m_FontCreator.TheFont);
}
}
您添加什么代码,以及在什么地方添加代码,以确保显式调用“ TheFont”的Dispose方法?
最佳答案
如果您不想在最初使用TheFont之后保留对其的引用,请在构造函数中紧随Initialize
之后调用它的Dispose方法。如果您希望让TheConsumer存活一段时间并维护对TheFont的引用,它将变得更加有趣。两种选择:
您可以从TheConsumer对象的Destructor中调用TheFont的dispose方法。这不是常见的做法,存在问题。通常,直到发生垃圾收集时才调用此方法。更好的是:
您可以使TheConsumer对象本身实现IDisposable,然后从TheConsumer.Dispose调用TheFont.Dispose。由于TheConsumer实现了IDisposable,因此使用它的代码应调用其Dispose方法。
编辑以回应苛刻的评论!
是的,我应该明确指出,除2外,仅使用1。我知道世界各地的所有开发人员都应该注意到IDisposable的实现时间,但他们通常没有注意到。如果被引用的托管资源实际上可能会保留很长时间,并且如果处理不当会导致问题,那么有时我会在保存引用的对象的析构函数中进行安全的Dispose()方法调用。这么错吗:)
关于c# - C#-与设计有关的配置问题(两个),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2015285/