这个问题在这里已有答案:
我试图在示例程序中实现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方法 . 因此,如果我在使用块中创建一个新实例,它将在现有的使用块之后进行配置 . 但是,我仍然能够在使用block.WHY之外访问objTestDispose对象?
请建议 .
UDPATE
Mr.BWA ..谢谢你让我的问题重复 . 但你应该知道我是一名学生并且正在学习 . 我脑子里有这个问题,所以我在这里问过 . **您不能仅为非托管资源说IDisposable接口 . **我也可以删除托管资源 . 这取决于实际情况 . 按照以下link -
如果您的对象已将250MB System.Drawing.Bitmap(即.NET托管的Bitmap类)分配为某种帧缓冲区,该怎么办?当然,这是一个托管的.NET对象,垃圾收集器将释放它 . 但是你真的想留下250MB的内存 - 等待垃圾收集器最终出现并释放它吗?如果有一个开放的数据库连接怎么办?当然,我们不希望该连接处于打开状态,等待GC完成对象 . 如果用户调用了Dispose()(意味着他们不再计划使用该对象),为什么不摆脱那些浪费的位图和数据库连接?所以现在我们将:摆脱非托管资源(因为我们必须),并摆脱托管资源(因为我们希望有所帮助)
3 回答
正在调用
Dispose
,但它没有注意到框架中的许多IDiposable
类还具有IsDisposed
属性来指示是否已释放非托管资源)您仍然可以访问它,因为您在
using
块的范围之外定义它并且因为您没有将其设置为null .请注意,
using
不会将对象设置为null,它只是意味着将调用您的Dispose()
方法,这为您提供了一种 Contract 保证的方式来处置任何非托管资源,否则垃圾收集器将不会清除这些资源 .您还应该考虑您的陈述的逻辑:
...一个对象怎么能把它自己设置为null?
来自MSDN
IDisposable Interface
这用于释放umnamaged资源,而不是用于销毁对象本身 .