【发布时间】:2017-01-21 23:46:36
【问题描述】:
我正在尝试在示例程序中实现 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 块之后被处置。但是,我仍然可以在 using 块之外访问 objTestDispose 对象。为什么?
请提出建议。
UDPATE
BWA 先生..感谢您重复我的问题。但你应该知道我是一名学生并且正在学习。我心中有这个问题,所以我在这里问了。 **您不能说 IDisposable 接口仅适用于非托管资源。**我也可以删除托管资源。这取决于实际情况。根据以下link -
如果您的对象已分配 250MB System.Drawing.Bitmap(即 .NET 托管的 Bitmap 类)作为某种帧缓冲区,该怎么办?当然,这是一个托管的 .NET 对象,垃圾收集器会释放它。但是你真的想留下 250MB 的内存就坐在那里——等待垃圾收集器最终出现并释放它吗?如果有一个开放的数据库连接怎么办?当然,我们不希望该连接处于打开状态,等待 GC 完成对象。
如果用户调用了 Dispose()(意味着他们不再打算使用 对象)为什么不摆脱那些浪费的位图和数据库 连接?
所以现在我们将:
摆脱非托管资源(因为我们必须这样做),并摆脱 托管资源(因为我们希望提供帮助)
【问题讨论】:
-
因为你在 using 块之外声明了它。它不会神奇地消失。
-
即使您在
using (SqlConnection conn = new SqlConnection("Conn string"))之外声明某些内容,它也会在之后存在,因为许多其他人也在发布。 -
已丢弃!= 垃圾收集
-
不要混淆更新中的问题 - 没有人说
IDisposable仅用于非托管资源而不是托管。当然,如果您愿意,它可以同时用于两者。正如我所说,合同约定 Dispose() 将被调用,因此这是处置非托管资源的最有效方式。如果你想在Dispose()中做其他事情,那就这样吧。
标签: c# dispose using idisposable