我想知道在调用Dispose()方法时执行了什么操作.Object在Dispose()调用或Dispose()上快速释放所有资源,标记Object已准备好进行垃圾回收.当我们将Object引用设置为NULL时发生了什么.实际上我在.NET 2.0中有Windows表单应用程序.并且我希望在经过一定时间后调用垃圾收集器(例如5分钟后)以收集所有未引用的对象.
经过很多Idisposable的文章后,我对它的用法感到困惑.所有文章都解释了它是什么以及如何实现.如果我们没有,我想了解我们会想念的内容.它是一个接口,其中包含一个方法Dispose().让我们举一个例子通常使用dispose显示为处理数据库连接.
代码就像
public class Test : IDisposable
{
public Test()
{
DatabaseConnection databaseConnection = new DatabaseConnection();
}
public void Dispose()
{
if (this.databaseConnection != null)
{
this.databaseConnection.Dispose();
this.databaseConnection = null;
}
}
}
Run Code Online (Sandbox Code Playgroud)
尽管配置已实现但是在dispose方法中,databaseconnection的dispose属性用于释放连接(this.databaseConnection.Dispose();)
我的问题是为什么在这种情况下我们需要实现IDisposable? 我们可以直接调用this.databaseConnection.Dispose()并释放连接.为什么在内部实现dispose也调用对象的dispose属性.作为Idisposable方法的替代方案,我们可以实现释放方法以释放内存.
public class Test
{
public Test()
{
DatabaseConnection databaseConnection = new DatabaseConnection();
}
public void Release()
{
if (this.databaseConnection != null)
{
this.databaseConnection.Dispose();
this.databaseConnection = null;
}
}
}
Run Code Online (Sandbox Code Playgroud)
这两种方法有什么不同?我们真的需要Idisposable吗?我期待着一个具体的解释.
今天早些时候,我在工作中对某些代码运行代码分析时遇到了CA1063 。
我有两个问题:
为什么以下代码不会导致 CA1063,即使它明显违反了某些要求(例如 Dispose 被覆盖)
代码的实际问题是什么,导致了由密封的 Dispose() 和终结器等调用的虚拟 Dispose(bool) 的复杂方案。
Run Code Online (Sandbox Code Playgroud)using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Foobar : IDisposable { public Foobar() { Console.Out.WriteLine("Constructor of Foobar"); } public virtual void Dispose() { Console.Out.WriteLine("Dispose of Foobar"); GC.SuppressFinalize(this); } ~Foobar() { Console.Out.WriteLine("Finalizer of Foobar"); } } class Derived : Foobar { public Derived() { Console.Out.WriteLine("Constructor of Derived"); } public override void Dispose() { Console.Out.WriteLine("Dispose of Derived"); GC.SuppressFinalize(this); base.Dispose(); } ~Derived() { Console.Out.WriteLine("Finalizer of …