C# DbConnection是否在超出范围时关闭并释放?

C# DbConnection是否在超出范围时关闭并释放?,c#,.net,ado.net,garbage-collection,dispose,C#,.net,Ado.net,Garbage Collection,Dispose,可能重复: 我的数据层中的许多函数不受try-catch或using子句的保护 我的GUI层有try-catch子句。这够了吗 如果引发异常,我是否可以依赖dbConnection和其他正在处理和关闭的对象?GUI层将处理异常 这够了吗 不可以。除了通过使用之外,不会自动处理任何内容。对象超出范围时不会被收集-gargage收集会在稍后间歇性地进行,并且是不确定的 如果要创建连接,请使用using,除非这是不可能的(例如异步回调)。否则,很容易留下大量的开放连接对象,使服务器饱和。也许可以做到

可能重复:

我的数据层中的许多函数不受
try-catch
using
子句的保护

我的GUI层有
try-catch
子句。这够了吗

如果引发异常,我是否可以依赖
dbConnection
和其他正在处理和关闭的对象?GUI层将处理异常

这够了吗

不可以。除了通过
使用
之外,不会自动处理任何内容。对象超出范围时不会被收集-gargage收集会在稍后间歇性地进行,并且是不确定的

如果要创建连接,请使用
using
,除非这是不可能的(例如异步回调)。否则,很容易留下大量的开放连接对象,使服务器饱和。

也许可以做到这一点,但这并不意味着这是一个好主意

一般来说,我肯定会在处理DB连接的逻辑中使用
try-catch-finally
子句(或
using
)。这不仅会因为您询问的原因而更安全,而且会更清楚地表明事情处理得很好,而且如果您以后决定更改GUI层中的某些内容,则会更难意外地将某些内容弄糟

您应该尽可能接近您需要的位置来处理这种类型的逻辑(以及实例的创建和处理)


注意:
Finally
子句将允许您确保连接已关闭,但如果您需要,仍然允许任何异常“冒泡”到顶部

如前所述,垃圾收集与超出范围的变量无关。至于DbConnection的close和dispose,在SqlConnection的情况下,如果调用dispose,if将关闭连接,然后对其进行处理。尽管还有其他提供者需要显式关闭然后进行处置。例如,在ODP.Net的OracleConnection中,Dispose不会关闭连接


您需要了解DbConnection是一个抽象类,当涉及到实际行为时,它完全取决于具体类。

好的,那么如果我使用
使用
,我还能让异常“冒泡”到GUI层进行处理吗?@CJ7是的,这将自动发生;你不需要改变任何东西来让它继续发生,而且它不会因为使用
添加
而受到影响,除非有一个坏的
Dispose()
实现(WCF为此而臭名昭著),它真的是个问题吗?服务器不能处理大量连接吗?当然,gargage系列会产生一个好的结果,除非你正在做一些非常奇怪的事情,比如在一个大的
for
循环中打开连接。@CJ7批次?对疯狂的数量?没有。如果我在代码中保持连接打开,我估计在池饱和和系统崩溃之前还有6秒钟。请注意,这是每个节点的连接池,而不是物理sql server限制;但是为什么要将sql server暴露在不必要的负载下?不正确处理这些问题就是懒惰。