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()(意味着他们不再计划使用对象)为什么不摆脱那些浪费的位图和数据库连接?
那么现在我们将:
摆脱非托管资源(因为我们必须这样做),并且摆脱管理资源(因为我们想要有所帮助)
Dispose
正在被调用,但它不做任何事情来破坏对象本身(您会注意到框架中的许多IDiposable
类另外有一个IsDisposed
属性来指示非托管资源是否已被释放)
您仍然可以访问它,因为您在using
块的范围之外定义了它,并且没有将其设置为null。
注意using
没有将对象设置为null,它只是意味着你的Dispose()
方法将被调用,这给了你一个契约保证的方式来处理任何非托管的资源,否则不会被垃圾收集器清理。
你还应该考虑语句的逻辑:
相信,使用block自动调用dispose方法。因此,如果我在using block中创建一个新的实例,它将在现有的using block之后被丢弃。
…一个对象怎么能把自己设为空呢?
From MSDN
<<p> IDisposable接口/strong>提供释放非托管资源的机制。
这个接口的主要用途是释放非托管资源。垃圾收集器自动释放分配给管理对象,当该对象不再使用时。然而,事实并非如此可以预测垃圾收集何时发生。此外,垃圾收集器不知道非托管资源,例如窗口句柄,或打开文件和流。的Dispose方法中显式释放非托管资源与垃圾收集器结合使用。对象的消费者可以当不再需要该对象时,调用此方法。