Implementing IDisposable in C#

本文关键字:in IDisposable Implementing | 更新日期: 2023-09-27 18:06:51

我试图在一个示例程序中实现IDisposable。如果我在using块语句中使用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块语句中创建了一个新实例。
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方法。所以,如果我在using块中创建一个新的实例,它将在现有的using块后被处置。但是,我仍然能够访问使用块之外的objTestDispose对象。为什么?

请建议。

UDPATE

Mr.BWA . .谢谢你把我的问题重复了一遍。但你应该知道我是一个学生和学习。我心里有这个问题,所以我在这里问。你不能说IDisposable接口只针对非托管资源。**我也可以移除管理的资源。这取决于具体情况。按照下面的链接-

如果你的对象已经分配了一个250MB的System.Drawing.Bitmap(即。net管理的Bitmap类)作为某种类型的帧缓冲怎么办?当然,这是一个托管的。net对象,垃圾收集器将释放它。但是,您真的想让250MB的内存只是坐在那里——等待垃圾收集器最终来释放它吗?如果有开放的数据库连接怎么办?当然,我们不希望这个连接处于打开状态,等待GC完成对象。

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

那么现在我们将:

摆脱非托管资源(因为我们必须这样做),并且摆脱管理资源(因为我们想要有所帮助)

Implementing IDisposable in C#

Dispose正在被调用,但它不做任何事情来破坏对象本身(您会注意到框架中的许多IDiposable类另外有一个IsDisposed属性来指示非托管资源是否已被释放)

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

注意using没有将对象设置为null,它只是意味着你的Dispose()方法将被调用,这给了你一个契约保证的方式来处理任何非托管的资源,否则不会被垃圾收集器清理。

你还应该考虑语句的逻辑:

相信,使用block自动调用dispose方法。因此,如果我在using block中创建一个新的实例,它将在现有的using block之后被丢弃。

…一个对象怎么能把自己设为空呢?

From MSDN

<<p> IDisposable接口/strong>

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

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

用于释放未损坏的资源,而不是用于销毁对象本身。