如何在我的自定义类上使用IDisposable?

时间:2010-07-06 17:44:17

标签: c# .net idisposable

这就是我所拥有的:

public void FindByID(string id)
{
    using (Parser parser = new Parser()) {
        if ( parser.LoadUserById(id)) {
            ID = parser.FindID();
            Name = parser.FindName();
            // ...
        }
        else {
            MessageBox.Show("User not found.");
        }
    } // end using block. parser is disposed so its memory is free to use again. 
}

这是实际的Parser类本身:

public class Parser : IDisposable
{                
    XDocument doc;
    bool userExists = true;
    private const string xmlInformationAddress = 
            "http://www.dreamincode.net/forums/xml.php?showuser={0}";

    public bool LoadUserById(string userID)
    {
        try
        {
            doc = XDocument.Load(String.Format(xmlInformationAddress, userID));

            if (doc.Root.Elements().Any())
            {
                userExists = true;
                return true;
            }
            else 
            {
                userExists = false;                
                return false;
            }
        }
        catch (Exception e)
        {
            doc = new XDocument();
            userExists = false;
            return false;
        }
    }
}

它说我没有实现Dispose()方法,但是我不确定该方法应该包含什么内容。

3 个答案:

答案 0 :(得分:13)

那么,为什么希望实施IDisposable?如果你没有什么可以处理的(这看起来像是这里的情况)那么客户不应该打电话给Dispose

您似乎认为调用Dispose将释放对象占用的内存。那是垃圾收集器的工作 - Dipose是完全独立的。它旨在释放非托管资源,例如文件句柄(包括间接持有的资源,例如对Streams的引用)。

在这种情况下:

  • 不要实施IDisposable
  • 摆脱调用代码中的using语句
  • 信任GC:)

答案 1 :(得分:5)

您的课程似乎不需要实现IDisposable。话虽这么说,如果你想了解如何以及为什么要实现它,你可以阅读my series on IDisposable。它将详细介绍如何以及为何(以及何时)实现IDisposable。

在这种情况下,您没有理由使用IDisposable,因为您的对象不包含任何本机资源。如果它使用本机资源,或封装了另一个实现IDisposable的类,那么,只有这样,你才应该实现IDisposable。

话虽这么说,IDisposable与释放内存无关 - 这是GC的工作。它是关于释放资源,包括内存(本地分配),但更多时候涉及本机句柄和其他资源。

答案 2 :(得分:-1)

我同意Jon Skeet。但如果你确实有某些东西要“处理” -

var x = new Parser();
using (x) {
   // Do stuff
}