一直见使用using连数据库.没深刻体悟其释放,销毁对象的功能
如下:model1 是从字典中获取的对象
using (var model = model1)
{
}
public static Dictionary<string, IfcStore> ModelDic = new Dictionary<string, IfcStore>();
if (re== "ok"&& ModelDic.ContainsKey(modelname)) { return ModelDic[modelname]; // IfcStore ifc; // ModelDic.TryGetValue(modelname,out ifc); // return ifc; }
放入model 用了一次后,在此web请求.发现是一个空壳.里边没数据.调试了下,确定字典取值不存在问题,字典像个容器,忽然想到可能是using给我dispose()释放掉了.
附资料:
经常使用using的地方
using(SqlConnection con=new SplConnection(connString)) { using(SqlCommand cmd=new SqlCommand(cmdTxt,con))
using的原理
为什么出了using所在的{},会自动回收对象。
原因是当我们将要出{},系统自动调用了Dispose()方法。
而在DISpose方法中是这么实现的
using语句的作用
1.作为关键字,using可以导入命名空间.
2.作为C#语句,using可以释放对象占用的内存资源.
using语句的本质
既然using可以释放对象,那么是不是在所有的对象前都可以用using来限制? <不是>
原因如下:
1.using可以主动释放的对象都需要实现IDisable借口.
2.即使都实现了IDisable接口,也没有必要全部使用using.我们只对那些对系统性能有重要影响的对象进行using限定,而其他的对象可以交给垃圾回收器处理.
哪些对象才可以使用Using回收!
必须实现了IDisposable 接口的类型才可以使用using回收!
using回收的是托管还是非托管资源?
解析:什么是托管:所有的C#代码都是被CLR监管,
结论是using回收的是 非托管资源!
Using释放的是托管资源还是非托管资源?
解析:非托管,C#应用托管到.NET Framework.但是他可以释放非托管资源。
Dispose方法会自动调用Close()
要想让一个类型可以通过using管理,该类型或者父类必须实现了IDisposable接口。
using(SqlConnection con=new SqlConnection)
{
//本质上自动调用了Dispose方法
}
close()和dispose()区别?
解析:close()只是关闭连接,但是通道没有销毁,dispose()不仅把连接给关闭了,而且把通道也给销毁了。