S****e 发帖数: 10596 | 1 本人低手,完全靠抄抄改改过日
C# 连接数据库很多人的程序
用using, try
我发现不用也可以
请高人说说为啥要用这两个
谢谢 |
a*****a 发帖数: 163 | 2 Using 是为用完了及时释放和数据库的连接(等Garbage Collector 来释放资源不如手
动来得迅速)。try是怕连接失败吧。 |
y*****7 发帖数: 1555 | 3 using其实就是一个short版的try final 在final里,会call被wrap的object的Dispose
方法。其实就是让你可以少code一点。
所有资源的释放,还是走的GC。所以一般来说不是caller可以控制的。
try 是用来抓exception,如果你这里不抓,就会bubble up。而如果bubble up的时候
,你的object hold了其他资源(如IO口,DB connection什么的),会造成resource
leak |
S****e 发帖数: 10596 | 4 谢谢
释放链接就是
con.Close();吗?
也就是using不用这个就能释放是吧?
【在 a*****a 的大作中提到】 : Using 是为用完了及时释放和数据库的连接(等Garbage Collector 来释放资源不如手 : 动来得迅速)。try是怕连接失败吧。
|
S****e 发帖数: 10596 | 5 谢谢
对于简单的数据库应用
假设就是往里面insert一行
在真正的网站应用中,除非服务器down掉
应该不会出现exception吧
Dispose
【在 y*****7 的大作中提到】 : using其实就是一个short版的try final 在final里,会call被wrap的object的Dispose : 方法。其实就是让你可以少code一点。 : 所有资源的释放,还是走的GC。所以一般来说不是caller可以控制的。 : try 是用来抓exception,如果你这里不抓,就会bubble up。而如果bubble up的时候 : ,你的object hold了其他资源(如IO口,DB connection什么的),会造成resource : leak
|
a*****a 发帖数: 163 | 6 我怎么记得如果实现了IDisposible,并调用object.Dispose(),则会释放资源。并不是
所有资源都走GC.
Dispose
【在 y*****7 的大作中提到】 : using其实就是一个short版的try final 在final里,会call被wrap的object的Dispose : 方法。其实就是让你可以少code一点。 : 所有资源的释放,还是走的GC。所以一般来说不是caller可以控制的。 : try 是用来抓exception,如果你这里不抓,就会bubble up。而如果bubble up的时候 : ,你的object hold了其他资源(如IO口,DB connection什么的),会造成resource : leak
|
d****d 发帖数: 133 | 7 这个取决于具体的IDisposible.Dispose是怎么实现的
【在 a*****a 的大作中提到】 : 我怎么记得如果实现了IDisposible,并调用object.Dispose(),则会释放资源。并不是 : 所有资源都走GC. : : Dispose
|
s***o 发帖数: 2191 | 8 I think it depends on implementation. Dispose() is more for releasing
unmanaged resources.
【在 a*****a 的大作中提到】 : 我怎么记得如果实现了IDisposible,并调用object.Dispose(),则会释放资源。并不是 : 所有资源都走GC. : : Dispose
|
c**t 发帖数: 2744 | 9 用了using 就不再需要 .close()
【在 S****e 的大作中提到】 : 谢谢 : 对于简单的数据库应用 : 假设就是往里面insert一行 : 在真正的网站应用中,除非服务器down掉 : 应该不会出现exception吧 : : Dispose
|
y*****7 发帖数: 1555 | 10 分几层说吧:
1. using会在complie的时候自动扩展成try finally。如果被wrap的object implement
了IDisposal interface,就会在finally 里call这个object的dispose() method.然后
,using的任务完成了‘
2. 在dispose method里,具体的实现来完成具体的工作。例如是db connection的话,
dispose会call close把链接关掉(大多数的情况下其实是把connection返回给pool)
。这样,从caller的角度来看,你已经把resource release了。
3. resource 分成manager的和unmanager的。manager一般就是.NET的object,
unmanage的一般是各种resource的handler,如db的链接,io的链接。对于manage的,一
般就是把他mark成没有reference了,这样下次GC运行的时候就可以清掉了。 好像有个
method叫GC.Supress什么,这个好像是主动运行GC。这块我也不是非常清楚,不过,好
像也还是一个suggestion,GC动不动,里面还有算法的。
4. 对于unmanage的resource,一般是通过一个.net的object wrapper来管理。当你
call dispose的时候,这个object的dispose method 负责call具体的resource的close
method来清理内存什么的。
5.有时候你可能会用到destructor。这个应该是极不推荐的,具体的可以看看CLR via
C#。那里有很好的例子 |
y*****7 发帖数: 1555 | 11 不一定,比如说定义了一个foreign key,但插入的数据违反了这个key,就会有
SqlException
【在 S****e 的大作中提到】 : 谢谢 : 对于简单的数据库应用 : 假设就是往里面insert一行 : 在真正的网站应用中,除非服务器down掉 : 应该不会出现exception吧 : : Dispose
|
v******n 发帖数: 421 | 12 一点小更正:using里面的type必须实现IDisposable |
a9 发帖数: 21638 | 13 显式gc需要调用Gc.Collection()
时候
resource
【在 a*****a 的大作中提到】 : 我怎么记得如果实现了IDisposible,并调用object.Dispose(),则会释放资源。并不是 : 所有资源都走GC. : : Dispose
|