【发布时间】:2012-01-13 14:53:02
【问题描述】:
我正在开发一个“学习计划”,并在我的学习中使用 Code Rush 重构工具。随着 Code Rush 的最新更新,它一直建议在我的程序中实现 IDisposable。我知道 MSDN 关于 IDisposable 的说法,并且我对它的作用有一个真正的基本了解,但是因为我不知道实现它的所有含义,所以我一直忽略了这个建议。今天我决定进一步了解它并接受建议。
这是它添加到我的程序中的内容。
class Program : IDisposable
{
static Service _proxy;
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
if (_proxy != null)
{
_proxy.Dispose();
_proxy = null;
}
}
~Program()
{
Dispose(false);
}
所以我的问题是这样的。这是否做了我需要做的一切来获得 IDisposable 的优势,还是我需要在代码中做一些事情才能使它工作?我在上面设置了一个断点,并且从未通过调试器到达它,所以要么不需要它,要么我没有按照预期的方式使用它。有人可以解释一下这对我有什么作用或我应该如何使用它以便它对我有用吗?
【问题讨论】:
-
看起来是对的。 IDisposable 的想法是您的对象将引用非托管资源。由于 GC 不会清理非托管资源,因此对象需要说..“等等,我必须在被销毁之前做一些房屋清理”。每当您的对象使用非托管代码/调用或包含实现 IDisposable 的对象时,您还应该实现 IDisposable 并在任何实现它的对象上调用 Dispose() 和/或清理您的非托管代码。
-
坦率地说,在这种情况下,Code Rush 在这里做得很差。此代码建议可能会引入非常糟糕的行为 - 这是他们建议中的错误。
-
@tipx:追踪 Dispose(false) 的实际作用。
-
各位,谢谢你的笔记。我们将尽快修复实施 IDisposable 功能。
-
我们将在下一次更新中解决这个问题,我们还将改进对字段的分析,以确保该字段绝对拥有其内容并且它们不会在其他任何地方共享(引用/传递给) .
标签: c# refactoring idisposable coderush