相关疑难解决方法(0)

使用垃圾收集?

我想知道在调用Dispose()方法时执行了什么操作.Object在Dispose()调用或Dispose()上快速释放所有资源,标记Object已准备好进行垃圾回收.当我们将Object引用设置为NULL时发生了什么.实际上我在.NET 2.0中有Windows表单应用程序.并且我希望在经过一定时间后调用垃圾收集器(例如5分钟后)以收集所有未引用的对象.

c# garbage-collection dispose

8
推荐指数
2
解决办法
3718
查看次数

编写我们自己的Dispose方法而不是使用Idisposable

经过很多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吗?我期待着一个具体的解释.

c# idisposable

8
推荐指数
1
解决办法
2266
查看次数

为什么要采用复杂的方案来正确实现 IDisposable?

今天早些时候,我在工作中对某些代码运行代码分析时遇到了CA1063 。

我有两个问题:

  1. 为什么以下代码不会导致 CA1063,即使它明显违反了某些要求(例如 Dispose 被覆盖)

  2. 代码的实际问题是什么,导致了由密封的 Dispose() 和终结器等调用的虚拟 Dispose(bool) 的复杂方案。

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 …
Run Code Online (Sandbox Code Playgroud)

c# idisposable finalizer

3
推荐指数
1
解决办法
303
查看次数

标签 统计

c# ×3

idisposable ×2

dispose ×1

finalizer ×1

garbage-collection ×1