C# 在C中实现IDisposable#
我试图在一个示例程序中实现IDisposable。如果我在using block语句中使用SqlConnection类,它将自动处理它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()
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()实际上对处理托管资源更有用。@MohitobjTestDispose
一旦超出范围(在您的情况下,一旦Main()超出范围),垃圾收集器将在某个阶段自动(在大多数情况下)清除它已完成,但这也恰好是应用程序的结束)。请仔细阅读链接问题中的信息,它涵盖了IDisposable
的实现目的。