我是一名开发人员,负责维护并不断更快地创建应用程序。我遇到了一段使用.Dispose()
的代码,它位于using
语句中。
以下是代码:
using (IDbCommand cmd = proxy.Connection.CreateCommand())
{
cmd.CommandText = "usp_GetPluginInfo";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(proxy.Connection.CreateParameter(cmd, "@dealershipId", dealershipId));
cmd.Parameters.Add(proxy.Connection.CreateParameter(cmd, "@pluginId", pluginId));
PluginInfo[] pluginInfos = PopulatePluginsFromCommand(cmd);
result = pluginInfos.First();
cmd.Dispose();
}
命令完成后,最后}
处理不会吗?在这种情况下,我认为没有必要使用Dispose()
。
感谢您的所有帮助!
答案 0 :(得分:6)
你没错,没必要。
编译器将using
语句翻译为:
IDbCommand cmd = proxy.Connection.CreateCommand();
try
{
//...
}
finally
{
if(cmd != null)
((IDisposable)cmd).Dispose();
}
话虽如此,不止一次调用Dispose
也不应该“伤害”,因为正确的IDisposable实现应该是幂等的。但是,它是多余的,你应该删除它,因为你正在清理代码。
答案 1 :(得分:1)
你是对的! using
块是以下的语法糖:
IDbCommand cmd = proxy.Connection.CreateCommand();
try
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(proxy.Connection.CreateParameter(cmd, "@dealershipId", dealershipId));
cmd.Parameters.Add(proxy.Connection.CreateParameter(cmd, "@pluginId", pluginId));
PluginInfo[] pluginInfos = PopulatePluginsFromCommand(cmd);
result = pluginInfos.First();}
finally
{
if(cmd != null)
{
((IDisposable)cmd).Dispose();
}
}
所以是的,额外的cmd.Dispose();
是不必要的。在大多数情况下,编写良好的类在第二个.Dispose()
(使用所谓的Disposable Pattern)时不会执行任何操作,但有时会导致问题。摆脱它!
答案 2 :(得分:0)
using
语句始终调用IDisposable.Dispose()
方法。 cmb.Dispose()
代码是多余的
答案 3 :(得分:0)
使用调用在块退出时处理,无论块是成功运行还是发生异常。在您的示例中,对Dispose的显式调用是多余的。
答案 4 :(得分:0)
有一个一个的原因,他可以明确地把它放在那里。如果IDbCommand
不是System.Data
中的IDisposable
,并且由于某种原因而创建的界面继承自new
但使用override
而不是{{1}},他们可能有不同的行为。但是99.999999999%的时间绝对是多余的。
答案 5 :(得分:0)
它是冗余的,并且不保证对Dispose
的显式调用执行。如果你想明确地调用Dispose
,请确保在finally块中进行。
答案 6 :(得分:0)
cmd.Dispose();没必要。在没有正确实现Dispose()或抛出System.ObjectDisposedException的情况下,这可能是一个问题
请参阅下面的代码分析规则 The call to CA2202: Do not dispose objects multiple times