C# 一次性上下文作为方法参数

C# Disposable Context as Method Parameter

我对 IDisposable 方法参数有疑问。
假设我有一个 class 实现了 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 Class 的一个实例(例如 DB 上下文)放入一个方法中以执行上下文相关的操作。 通常我们在下面的例子中使用它:

static void Main(string[] args)
{
   using (var context = new TestClass())
   {
      X(context);
   }
}

public static void X(TestClass context)
{
  context.TestMethod();
}

结果如预期的那样调用了 Dispose() 方法。 (附加调试器,或在控制台上显示 "Test Method was disposed!")

所以问题是: 如果我会这样写:

static void Main(string[] args)
{   
   X(new TestClass());
}

我看不到任何调用 Dispose 方法的指示符?如果方法执行成功/完成,TestClass() 上下文是否自动处理。

垃圾收集器清理时是否调用了dispose方法? 我担心资源密集型上下文仍会打开?

垃圾收集器只能清理托管资源(用new创建的东西)。使用 非托管资源 的 类 通常会实现一个 finalizer/destructor,它会在您尚未调用时为您调用 Dispose()。垃圾收集器确实调用终结器。有关示例和更多信息,请参阅 here

如果您没有显式调用 Dispose() 并且您的 class 没有析构函数,则根本不会调用 Dispose()。这应该不是问题,因为那时垃圾收集器已经在清理了。

因此对于 class 不拥有非托管资源的实体,Dispose() 仅在 释放 资源时给予控制权。