在C#中实现IDisposable

时间:2016-09-14 08:32:44

标签: c# dispose using idisposable

我正在尝试在示例程序中实现IDisposable。如果我在using block语句中使用SqlConnection类,它将自动处理它。

public int testCon()
{
    using (SqlConnection conn = new SqlConnection("Conn string"))
    {
        using (SqlCommand cmd = conn.CreateCommand())
        {
            conn.Open();
            cmd.CommandText = "SELECT COUNT(1) FROM Carsd";

            return (int)cmd.ExecuteScalar();
        }
    }
}

我创建了一个类并实现了IDisposable。我在using block语句中创建了一个新实例。

class Program 
{
    static void Main(string[] args)
    {
        testDispose objTestDispose;

        using (objTestDispose = new testDispose())
        {
            objTestDispose.UserName = "testUser";
            objTestDispose.PassWord = "testPassword";                                
        }

        Console.WriteLine("Check obj of testDispose Class" + objTestDispose.UserName);
        Console.WriteLine("Check obj of testDispose Class" + objTestDispose.PassWord);
        Console.ReadLine();

    }        
}

public class testDispose : IDisposable
{
    public string UserName { get; set; }
    public string PassWord { get; set; }

    public void Dispose()
    { }              
}

我相信,使用block自动调用dispose方法。因此,如果我在使用块中创建一个新实例,它将在现有的使用块之后进行配置。但是,我仍然能够在使用block.WHY之外访问objTestDispose对象?

请建议。

UDPATE

Mr.BWA ..感谢你让我的问题重复。但你应该知道我是一名学生并且正在学习。我脑子里有这个问题,所以我在这里问过。 **您不能仅为非托管资源说IDisposable接口。**我也可以删除托管资源。这取决于实际情况。根据以下link -

  

如果您的对象已将250MB System.Drawing.Bitmap(即.NET托管的Bitmap类)分配为某种帧缓冲区,该怎么办?当然,这是一个托管的.NET对象,垃圾收集器将释放它。但是你真的想留下250MB的内存 - 等待垃圾收集器最终出现并释放它吗?如果有一个开放的数据库连接怎么办?当然,我们不希望该连接处于打开状态,等待GC完成对象。

     

如果用户调用了Dispose()(意味着他们不再计划使用)   对象)为什么不摆脱那些浪费的位图和数据库   连接吗?

     

现在我们将:

     

摆脱非托管资源(因为我们必须),并摆脱   托管资源(因为我们希望提供帮助)

3 个答案:

答案 0 :(得分:2)

Dispose正在被调用,但它没有做任何事情来破坏对象本身(你会注意到框架中的很多IDiposable类还有一个{ {1}}属性,指示是否已释放非托管资源)

答案 1 :(得分:2)

您仍然可以访问它,因为您将其定义在window.pollPieChart = new Chart(ctx, type: 'pie' data: data animation: animateRotate:true) 块的范围之外,因为您还没有将其设置为null。

请注意,using没有将对象设置为null,这只是意味着将调用您的using方法,这为您提供了一种合同保证的方式来处置任何非托管资源否则垃圾收集器不会清理它。

您还应该考虑您的陈述的逻辑:

  

我相信,使用block自动调用dispose方法。因此,如果我在使用块中创建一个新实例,它将在现有的使用块之后进行处理。

......一个物体怎么能把它自己设定为空?

答案 2 :(得分:1)

来自Redisson

IDisposable Interface

  

提供释放非托管资源的机制。

     

此接口的主要用途是释放非托管资源。   垃圾收集器自动释放分配给的内存   不再使用该对象时的托管对象。但事实并非如此   可以预测何时会发生垃圾收集。此外,   垃圾收集器不了解非托管资源,例如   窗口句柄,或打开文件和流。使用Dispose方法   此接口显式释放非托管资源   与垃圾收集器结合。对象的消费者可以   当不再需要该对象时调用此方法。

这用于释放umnamaged资源,而不是用于销毁对象本身。