C# 在C中实现IDisposable#

C# 在C中实现IDisposable#,c#,dispose,using,idisposable,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()

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

请建议

乌德帕特

BWA先生,谢谢你把我的问题重复一遍。但你应该知道我是一名学生,正在学习。我脑子里有这个问题,所以我在这里问了。 **您不能说IDisposable接口仅适用于非托管资源。**我还可以删除托管资源。这要视情况而定。根据以下资料—

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

如果用户已调用Dispose()(表示他们不再计划使用 对象)为什么不扔掉那些浪费的位图和数据库呢 联系

因此,现在我们将:

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


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

您仍然能够访问它,因为您使用块在
的范围之外定义了它,并且没有将其设置为null

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

你也应该考虑你的陈述逻辑:

我相信,使用block自动调用dispose方法。所以,如果我在using block中创建一个新实例,它将在现有using block之后进行处置

。。。对象如何将其自身设置为空

来自

IDisposable界面

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

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


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

因为您在using块之外声明了它。它不会神奇地消失。即使您使用(SqlConnection conn=new SqlConnection(“conn string”))在
之外声明了某个内容,它也会在之后存在,因为许多其他人也在发布。您是否已阅读或?已处理!=垃圾收集不要混淆更新中的问题-没有人说IDisposable只针对非托管资源,而不是托管资源。当然,如果你愿意,它可以同时用于这两个方面。正如我所说,根据合同约定,将调用Dispose(),因此这是处理非托管资源最有效的方法。如果您想在
Dispose()
中执行其他操作,那么就这样吧。先生。您能告诉我如何在代码中测试Dispose对象吗。这对我会有帮助。Dispose()实际上对处理托管资源更有用。@Mohit
objTestDispose
一旦超出范围(在您的情况下,一旦Main()超出范围),垃圾收集器将在某个阶段自动(在大多数情况下)清除它已完成,但这也恰好是应用程序的结束)。请仔细阅读链接问题中的信息,它涵盖了
IDisposable
的实现目的。