首页 文章

在C#中实现IDisposable [重复]

提问于
浏览
-5

这个问题在这里已有答案:

我试图在示例程序中实现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 回答

  • 2

    正在调用 Dispose ,但它没有注意到框架中的许多 IDiposable 类还具有 IsDisposed 属性来指示是否已释放非托管资源)

  • 2

    您仍然可以访问它,因为您在 using 块的范围之外定义它并且因为您没有将其设置为null .

    请注意, using 不会将对象设置为null,它只是意味着将调用您的 Dispose() 方法,这为您提供了一种 Contract 保证的方式来处置任何非托管资源,否则垃圾收集器将不会清除这些资源 .

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

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

    ...一个对象怎么能把它自己设置为null?

  • 1

    来自MSDN

    IDisposable Interface

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

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

相关问题