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()
仅在 释放 资源时给予控制权。
我对 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()
仅在 释放 资源时给予控制权。