C# 什么';在这两种情况下使用的区别是什么

C# 什么';在这两种情况下使用的区别是什么,c#,asp.net,performance,database-connection,using,C#,Asp.net,Performance,Database Connection,Using,我想知道,如果有区别: IfxDataReader ifxDataReaders = ifxCommand.ExecuteReader(); using (ifxDataReaders) { if (ifxDataReaders.Read()) { item = (i

我想知道,如果有区别:

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


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

在第一种情况下,在using块内外都有一个对象ifxDataReaders


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

只有第一个块中的变量可以导致ObjectDisposed异常,如果在未重新初始化的情况下使用它。

诱人的语句是说“第一个不会处理”,但它会

第二个诱人的说法是“如果
ExecuteReader
抛出异常,则第一个不会处理”,但在这种情况下,两个都不会处理

如果在
ExecuteReader
中发生错误,则在这两种情况下
ifxDataReaders
分配,因此
Dispose
调用无论如何都不会解决。另外,实际上并不需要调用
Close

Dispose
在这两种情况下都会被调用,我相信情况是一样的

变量范围将更改。在第二个实例中,
ifxDataReaders
的作用域是
使用
,而在第一个实例中,
ifxDataReaders
可以在
使用
之后使用(尽管此时您将使用已处理的对象)


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

范围不同-在第一种情况下,您可以再次使用ifxDataReaders,在第二种情况下,它将只是Local。您应该在第一种形式中看到此线程,也将调用Dispose。很抱歉,我忘记发布它了。
  using(IfxDataReader ifxDataReaders = ifxCommand.ExecuteReader())
                         {

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

                         }