这是我所拥有的:
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() 方法,但我不确定该方法内部应该包含什么。
那么,您为什么想要实施
IDisposable
?如果您没有任何东西可以处理(看起来就是这种情况),那么客户不必致电 Dispose
。
您似乎认为调用
Dispose
将释放对象占用的内存。这是垃圾收集器的工作 - Dipose
是完全独立的。它旨在释放非托管资源,例如文件句柄(包括间接持有的资源,例如对Streams
的引用)。
在这种情况下:
IDisposable
using
语句你的类似乎不需要实现 IDisposable。话虽这么说,如果您想了解如何以及为何实现它,您可以阅读我的 IDisposable 系列。它详细介绍了应该如何以及为何(以及何时)实现 IDisposable。
在这种情况下,您没有理由使用 IDisposable,因为您的对象不持有任何本机资源。如果它使用本机资源,或者封装了另一个实现 IDisposable 的类,那么,只有这样,您才应该实现 IDisposable。
话虽这么说,IDisposable 与释放内存无关——那是 GC 的工作。它与释放资源有关,其中可以包括内存(本机分配),但更常见的是本机句柄和其他资源。
我同意乔恩·斯基特的观点。但如果你确实有东西要“处理”-
var x = new Parser();
using (x) {
// Do stuff
}