多次处理对象

时间:2013-11-27 21:19:22

标签: c# visual-studio dispose using

我是一名开发人员,负责维护并不断更快地创建应用程序。我遇到了一段使用.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()

感谢您的所有帮助!

7 个答案:

答案 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