在这两种情况下使用有什么区别

时间:2012-07-25 09:58:17

标签: c# asp.net performance database-connection using

我想知道,如果之间存在差异:

IfxDataReader ifxDataReaders = ifxCommand.ExecuteReader();
                    using (ifxDataReaders)
                    {
                        if (ifxDataReaders.Read())
                        {
                            item = (int)ifxDataReaders[0];
                        }
                        ifxDataReaders.Close();
                    }

  using(IfxDataReader ifxDataReaders = ifxCommand.ExecuteReader())
                         {

                            if (ifxDataReaders.Read())
                            {
                                item = (int)ifxDataReaders[0];
                            }
                            ifxDataReaders.Close();

                         }

4 个答案:

答案 0 :(得分:3)

诱人的说法是说“第一个不会处置”,但它会。

第二个诱人的陈述是说“如果ExecuteReader抛出异常,第一个将不会处置”,但在这种情况下 都不会处置。

如果ExecuteReader发生错误,两个实例ifxDataReaders中都会 分配,因此Dispose来电将Close永远不会解决。另外,实际上并不需要调用Dispose

ifxDataReaders将在两个实例中被调用,我相信相同的情况。

可变范围将会改变。在第二个实例中,using的范围限定为ifxDataReaders,而在第一个using中可以使用 {{1}}之后(尽管如此,你) d此时使用被处置物体。)

第二种形式是首选,对我来说它似乎更明确,更具可读性。

答案 1 :(得分:1)

在第一种情况下,在使用块的内部和外部都有一个对象ifxDataReaders。

在第二种情况下,你只在使用块中有ifxDataReaders对象。

答案 2 :(得分:1)

只有第一个中的变量可用于导致ObjectDisposed异常(如果在不重新初始化的情况下使用它)。

答案 3 :(得分:-2)

在第二种情况下,Dispose将自动调用。