aba*_*hev 26 c# ado.net dispose sqlcommand sqlconnection
我通常使用这样的代码:
using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["MyConn"].ConnectionString))
{
var command = connection.CreateCommand();
command.CommandText = "...";
connection.Open();
command.ExecuteNonQuery();
}
Run Code Online (Sandbox Code Playgroud)
我会command自动处理吗?或者不是,我必须把它包装成using块?是否需要处理SqlCommand?
Ric*_*dOD 27
这样做:
using(var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["MyConn"].ConnectionString))
using(var command = connection.CreateCommand())
{
command.CommandText = "...";
connection.Open();
command.ExecuteNonQuery();
}
Run Code Online (Sandbox Code Playgroud)
不在命令上调用dispose也不会做任何太糟糕的事情.但是,在它上面调用Dispose会压缩对终结器的调用,从而使调用dispose成为一种性能增强.
Ada*_*lph 10
最安全的策略是,Dispose()如果对象IDisposable显式或通过using块实现,则始终调用它.可能存在不需要它但无论如何调用它应该永远不会引起问题(如果类正确写入)的情况.此外,您永远不知道实现何时可能会改变意味着以前不需要呼叫的地方现在肯定是必需的.
在您给出的示例中,您可以为命令添加额外的内部使用块,以及为连接维护外部使用块.
是的,您应该,即使它实现当前没有做太多,您也不知道将来如何更改它(例如更新的框架版本).通常,您应该将所有实现的对象都IDisposable放在安全的一侧.
但是,如果操作延迟并且您没有控制整个范围(例如,当异步工作或返回一个SqlDataReader左右时),您可以设置为CommandBehavior,CloseConnection以便在读取器完成后,连接正确关闭/处置你.
在实践中,您可以跳过Dispose。它不会释放任何资源。它甚至不会抑制终结,因为SQLCommand 构造函数会这样做。
Component从理论上讲,微软可以更改实现以保存非托管资源,但我希望他们早在这样做之前就推出了一个可以摆脱基类的 API 。