如果关联的SqlConnection将被丢弃,是否需要SqlCommand.Dispose()?
我通常使用这样的代码:
using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["MyConn"].ConnectionString)) { var command = connection.CreateCommand(); command.CommandText = "..."; connection.Open(); command.ExecuteNonQuery(); }
我的command
自动处理吗? 或者不是,我必须把它包装进using
块? 是否需要处理SqlCommand
?
只要这样做:
using(var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["MyConn"].ConnectionString)) using(var command = connection.CreateCommand()) { command.CommandText = "..."; connection.Open(); command.ExecuteNonQuery(); }
不要在命令上调用dispose不会有什么不好的。 但是调用Dispose就会禁止对终结器的调用 ,使得调用处理性能增强。
最安全的策略是,如果通过明确地或通过使用块来实现IDisposable
,则始终在对象上调用Dispose()
。 可能有些情况下不需要,但无论如何都不应该引起问题(如果课程正确写入)。 而且,你永远不知道什么时候执行可能会改变,这意味着以前不需要的调用,现在肯定是必需的。
在你给出的例子中,你可以为命令添加一个额外的内部使用块,并且维护连接的外部使用块。
是的,你应该,即使它的实现目前没有太多,你不知道将来如何改变(比如更新的框架版本)。 一般来说,你应该把所有实现IDisposable
对象放在安全的一边。
但是,如果操作是延迟的,并且您不控制整个范围(例如,当以asynchronous方式工作时,或者在返回SqlDataReader
时),则可以将CommandBehavior
设置为CloseConnection
以便只要读取器完成,连接正确closures/为您处置。
你可以使用reflection器find这种东西。
我有一个小的挖掘(我build议你挖掘自己,虽然要充分确保其余的这一点,但我没有这么努力),它看起来像当你杀了一个连接,没有任何儿童相关的处置与那个连接。 此外,实际上并不像一个指挥处置那么多。 它会将字段设置为null,从容器中分离(这可以防止pipe理的内存泄漏)并引发一个事件(这可能很重要,但是我看不到谁正在监听这个事件)。
无论哪种方式,这是一个很好的做法,使用这个东西在一个使用块,或确保你处理它在对象持有连接(如果你打算保持一段时间的命令)处理模式。
在实践中,您可以跳过Dispose
。 它不释放任何资源。 它甚至没有压制定稿,因为构造函数是这样做的。
从理论上讲,微软可以改变实施方式来抓住一个非托pipe资源,但是我希望他们能早日摆脱Component
基础类的API。