何时应使用using语句?

10

可能是重复问题:
C#中的Using块是什么,我为什么要使用它?

我正在将一个旧站点转换为C#,但我不确定何时应该使用'using'。 有没有一般的指导方针? 我知道它的好处,但我不确定如何使用它。 每次我'new'一个方法/属性时都需要使用吗?

SqlConnection awesomeConn = new SqlConnection(connection);

首先确保您完全理解“using”的作用,然后它应该更容易。请参考此msdn页面:http://msdn.microsoft.com/en-us/library/yh598w02%28v=vs.100%29.aspx - Andriy Buday
5个回答

26
如果一个类实现了IDisposable接口,那么它将创建一些需要在使用完毕后进行“处理”的非托管资源。因此,您需要执行以下操作:
SqlConnection awesomeConn = new SqlConnection(connection);

// Do some stuff

awesomeConn.Dispose();

为了避免在出现异常时忘记处理资源(在这种情况下关闭数据库连接),您可以使用“using”语法,以便在离开“using”语句的作用域时自动调用dispose:
using (SqlConnection awesomeConn = new SqlConnection(connection))
{
     // Do some stuff
} // automatically does the .Dispose call as if it was in a finally block

实际上,using 块等同于:

try
{
    SqlConnection awesomeConn = new SqlConnection(connection);

    // do some stuff
}
finally 
{
    awesomeConn.Dispose();
}

10

MSDN:

使用 IDisposable 对象时,您应该在 using 语句中声明并实例化它。using 语句正确地调用对象的 Dispose 方法,并且(在以前所示的方式使用它时)还会导致对象本身在调用 Dispose 后立即超出范围。在 using 块内,对象是只读的,不能修改或重新分配。

即使在调用对象方法时发生异常,using 语句也确保调用了 Dispose。 您可以通过将对象放入 try 块中并在 finally 块中调用 Dispose 来实现相同的结果;实际上,这就是编译器如何将 using 语句转换的方式。编译时,代码示例最初扩展为以下代码(注意额外的花括号,以创建对象的有限作用域):

示例:

using (StreamReader stream = new StreamReader("path")) 
{
     string line = stream.ReadLine();
}

1

对于所有实现IDisposable接口的对象,除非它们的生命周期超出当前执行范围(例如方法调用),否则请使用using。在这种情况下,例如如果您有一个可处理的成员变量,则包含该变量的类应该实现IDisposable并在其Dispose中处理成员变量。


0

0

使用using语句是一种方便的方式,可以确保您在不处理资源的情况下无法退出块。每当您必须在本地代码块中使用IDisposable实现者时,都应该使用它。


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