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

问题描述 投票:0回答:3

这是我所拥有的:

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() 方法,但我不确定该方法内部应该包含什么。

c# .net idisposable
3个回答
13
投票

那么,您为什么想要实施

IDisposable
?如果您没有任何东西可以处理(看起来就是这种情况),那么客户不必致电
Dispose

您似乎认为调用

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

在这种情况下:

  • 不要实施
    IDisposable
  • 删除调用代码中的
    using
    语句
  • 相信GC :)

5
投票

你的类似乎不需要实现 IDisposable。话虽这么说,如果您想了解如何以及为何实现它,您可以阅读我的 IDisposable 系列。它详细介绍了应该如何以及为何(以及何时)实现 IDisposable。

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

话虽这么说,IDisposable 与释放内存无关——那是 GC 的工作。它与释放资源有关,其中可以包括内存(本机分配),但更常见的是本机句柄和其他资源。


-1
投票

我同意乔恩·斯基特的观点。但如果你确实有东西要“处理”-

var x = new Parser();
using (x) {
   // Do stuff
}
© www.soinside.com 2019 - 2024. All rights reserved.