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

问题描述 投票:0回答:1

我对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方法?我担心资源密集型环境是否仍然开放?

c# performance garbage-collection dispose
1个回答
0
投票

垃圾收集器只能清理托管资源(使用new创建的内容)。与非托管资源一起使用的类通常实现一个终结器/析构函数,当您尚未调用时,该终结器将为您调用Dispose()。垃圾收集器会调用终结器。有关示例和更多信息,请参见here

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

因此,对于不拥有非托管资源的类,Dispose()仅控制要释放when资源。

© www.soinside.com 2019 - 2024. All rights reserved.