【发布时间】:2011-12-23 18:40:54
【问题描述】:
我目前正在审查一个 C# 应用程序,我在其中看到:
public static bool ServiceExists(string servicename)
{
ServiceController[] services = ServiceController.GetServices();
foreach (ServiceController s in services)
{
if (s.ServiceName == servicename)
{
return true;
}
}
return false;
}
在这个answer中,Henk表示不使用Dispose()(或using)不会产生内存泄漏,是真是假?
我可以保留以前的代码吗?或者我应该写一些类似的东西:
public static bool ServiceExists(string servicename)
{
ServiceController[] services = ServiceController.GetServices();
bool exists = false;
foreach (ServiceController s in services)
{
using(s)
{
if (s.ServiceName == servicename)
{
exists = true;
}
}
}
return exists;
}
在这种情况下不使用Dispose()(或using)有什么风险?
【问题讨论】:
-
错误示例。此方法不拥有个服务。它不应该 Dispose() 他们。第二个版本只处理了一些。
-
@HenkHolterman:我编辑了第二个版本,包括你的评论。我可以根据什么知道是否应该致电
Dispose()? -
只有当 GetServices() 方法清楚地记录了责任转移给调用者时。您的版本很可能会导致运行时错误。
-
拥有 ServiceControllers 的对象应该是对它们发起 Dispose 的对象。如果 GetServices() 正在创建 ServiceControllers 的新实例,那么您应该在此方法中启动 Dispose。否则,应该由“拥有”这些 ServiceController 的对象调用 Dispose 方法。
-
查看ILDASM在System.ServiceProcess.dll上的输出,看来有必要对GetServices()返回的ServiceControllers进行Dispose()。在 GetServices 中,它们调用 ServiceController 的构造函数,将本机资源传递给它。值得注意的是,MSDN 示例代码没有调用 Dispose(); msdn.microsoft.com/en-us/library/…,这似乎是微软的一个错误,我希望他们能澄清或更新他们的文档。
标签: c# memory-leaks idisposable