10

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

我正在将旧网站转换为 C#,但我不确定何时应该使用“使用”。有没有一般的指导方针?我知道好处,但我不是 100% 确定如何使用它。每次我“新”一个方法/属性时都是这样吗?

SqlConnection awesomeConn = new SqlConnection(connection);
4

5 回答 5

24

如果一个类实现了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();
}
于 2012-04-07T18:56:57.987 回答
10

MSDN

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

using 语句可确保调用 Dispose,即使在调用对象上的方法时发生异常也是如此。您可以通过将对象放在 try 块中,然后在 finally 块中调用 Dispose 来获得相同的结果;事实上,这就是编译器翻译 using 语句的方式。前面的代码示例在编译时扩展为以下代码(注意额外的花括号以创建对象的有限范围):

例子:

using (StreamReader stream = new StreamReader("path")) 
{
     string line = stream.ReadLine();
}
于 2012-04-07T18:54:34.450 回答
1

对您实例化的所有实现 IDisposable 的对象使用 using,除非它们的生命周期超出当前执行范围(即方法调用)。在这种情况下,例如,如果您有一个一次性成员变量,那么包含类应该在其 Dispose 中实现 IDisposable 和 Dispose 成员。

于 2012-04-07T18:59:06.660 回答
0

如果您想自动处置对象,则经常使用它。否则你必须手动调用 myobj.Dispose() 。

请参阅此处的参考文档:http: //msdn.microsoft.com/en-us/library/yh598w02.aspx

于 2012-04-07T18:53:47.177 回答
0

Using 是一种方便,它允许您确保在不处理资源的情况下无法退出块。每当您必须在本地代码块中使用 IDisposable 实现程序时,都可以并且应该使用它。

于 2012-04-07T18:54:13.010 回答