这就是我所拥有的:
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()方法,但是我不确定该方法应该包含什么内容。
答案 0 :(得分:13)
那么,为什么希望实施IDisposable
?如果你没有什么可以处理的(这看起来像是这里的情况)那么客户不应该打电话给Dispose
。
您似乎认为调用Dispose
将释放对象占用的内存。那是垃圾收集器的工作 - Dipose
是完全独立的。它旨在释放非托管资源,例如文件句柄(包括间接持有的资源,例如对Streams
的引用)。
在这种情况下:
IDisposable
using
语句答案 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
}