我今天早些时候问了一个问题,但我认为我需要以一种不同的方式来解决这个问题(最重要的是,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/

10-14 20:54