使用using来释放资源。

4

我刚开始使用 "using" 来确保资源被释放,无论发生什么情况。

下面是我编写的一些代码示例,用于检索一些数据。我的问题是:

是否需要所有的 "using",或者只有第一个就足够了?

        SomeMethod()
        {
            using (SqlConnection cn = new SqlConnection("myConnection"))
            {
                cn.Open();

                using (SqlCommand cmd = cn.CreateCommand())
                {
                    cmd.CommandText = "myQuery";
                    using (SqlDataReader rdr = cmd.ExecuteReader())
                    {
                        if(rdr.HasRows)
                        {
                            while (rdr.Read())
                                // do something
                        }
                    }
                }
            }
        }

12
简短回答:所有的都是必需的。 - Tim Schmelter
好的,我也是这么想的 - 合情合理(虽然我意识到可能有很多我不知道的事情在发生)。 - mHelpMe
1
即使不需要使用 Dispose,使用 using 也是更好的选择。为什么呢?因为你不知道它是否实现了 IDisposable 接口,通常不会无缘无故地实现。 - Tim Schmelter
3
值得注意的是,在某些情况下,您可以将using语句链接在一起,以减少缩进等。 - James Thorpe
显示剩余2条评论
3个回答

4

使用就是:

SomeClass o = null;
try 
{ 
   // managed resource that you use
   o = new SomeClass();  
   // ... some other code  here
}
finally 
{
  if(o != null)
    o.Dispose();
}

如果一个类实现了IDisposable接口,那么当你使用一些托管资源时,使用using语句是没有问题的。当你想要使用一些托管资源时,就使用using吧 :)


你的示例中 o 的声明需要在 try 之前。 - Scoregraphic

2

使用是以下模式的快捷方式:

IDisposable resource = .....;
try
{
}
finally
{
    if (resource != null)
        resource.Dispose();
}

我强烈建议在使用需要处理或者实现了IDisposable接口的资源时,始终使用using。原因是您不知道其背后的实现方式,通过这种方式更加安全,可以防止出现内存泄漏或其他代码问题。


1

所有的 "using" 都是必需的吗?还是只有第一个足够了?

如果您使用的任何对象都实现了 IDisposable 接口,您可以使用 using 语句来自动释放对象,或者您可以手动释放(对于任何流等)您的对象而不使用 using,只需调用 Dispose() 方法即可。

因此,对于所有可被释放的对象最好使用 using 语句。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接