我对IDisposable方法参数有疑问。假设我有一个实现IDisposable接口的类,例如“ TestClass”:
class TestClass : IDisposable
{
public void TestMethod()
{
Console.WriteLine("I am a Test Method");
}
public void Dispose()
{
Console.WriteLine("Test Method was disposed!");
}
}
假设我想将IDisposable类的实例(例如,数据库上下文)放入一种方法中,以执行上下文相关的操作。通常我们在以下示例中使用它:
static void Main(string[] args)
{
using (var context = new TestClass())
{
X(context);
}
}
public static void X(TestClass context)
{
context.TestMethod();
}
正如预期的那样,将调用Dispose()方法。 (已附加调试器,或在控制台上显示“已废弃测试方法!”)
所以问题是:如果我会写这样的话:
static void Main(string[] args)
{
X(new TestClass());
}
我看不到任何指示已调用Dispose方法的指示?如果方法的执行成功/完成,是否自动处理TestClass()上下文。
垃圾回收器清理时是否调用了dispose方法?我担心资源密集型环境是否仍然开放?
垃圾收集器只能清理托管资源(使用new
创建的内容)。与非托管资源一起使用的类通常实现一个终结器/析构函数,当您尚未调用时,该终结器将为您调用Dispose()
。垃圾收集器会调用终结器。有关示例和更多信息,请参见here。
如果您未显式调用Dispose()
并且您的类没有析构函数,则将不会调用Dispose()
。这应该不成问题,因为那时垃圾收集器已经在清理了。
因此,对于不拥有非托管资源的类,Dispose()
仅控制要释放when资源。