4

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

我已经看到在代码块中间使用了 using 语句,这是什么原因?

4

6 回答 6

41

using语法可以(应该)用作定义任何实现IDisposable的范围的方法。using 语句确保在发生异常时调用 Dispose。

    //the compiler will create a local variable 
    //which will go out of scope outside this context 
    using (FileStream fs = new FileStream(file, FileMode.Open))
    {
         //do stuff
    }

或者,您可以只使用:

    FileStream fs;
    try{
       fs = new FileStream();
       //do Stuff
    }
    finally{
        if(fs!=null)
           fs.Dispose();
    }

来自 MSDN 的额外阅读

C# 通过 .NET Framework 公共语言运行时 (CLR) 自动释放用于存储不再需要的对象的内存。内存的释放是不确定的;每当 CLR 决定执行垃圾回收时,就会释放内存。但是,通常最好尽快释放文件句柄和网络连接等有限资源。

using 语句允许程序员指定使用资源的对象何时应该释放它们。提供给 using 语句的对象必须实现 IDisposable 接口。该接口提供了 Dispose 方法,该方法应该释放对象的资源。

于 2009-03-05T14:24:43.740 回答
3

它通常在打开到流或数据库的连接时使用。

它的行为类似于 try { ... } finally { ... } 块。在using块之后,括号中实例化的 IDisposable 对象将被正确关闭。

using (Stream stream = new Stream(...))
{


}

在此示例中,流在块之后正确关闭。

于 2009-03-05T14:28:45.197 回答
3

使用最终尝试语法糖用于任何具有 IDisposable.. 的东西,比如 sqlconnection。它的使用确保某些东西在超出using(){}范围后被处置。

using(SqlConnection conn = new SqlConnection(connString))
{
  //use connection
}

//shorter than

SqlConnection conn = new SqlConnection(connString)
try
{
  //use connection 
}
finally
{
    conn.Dispose();
}
于 2009-03-05T14:33:16.217 回答
2

using 语句确保对象在不再需要时被正确处理。它基本上可以节省您编写 obj.Dispose(); 并提供关于变量范围和使用的可视化指南。

有关详细信息,请参阅MSDN 页面

于 2009-03-05T14:27:17.853 回答
2

这种使用形式与释放资源有关。它只能与实现 IDisposable 接口的类结合使用。

例子:

using(SqlConnection conn = new SqlConnection(someConnectionString))
{
     //Do some database stuff here
}

在 using 块结束时调用 conn.Dispose,即使在块内引发异常也是如此。在 SwqlConnection 对象的情况下意味着连接总是关闭的。

这种结构的一个缺点是现在有办法知道发生了什么。

希望这有助于回答您的问题?

于 2009-03-05T14:33:39.397 回答
2

每当您的代码创建一个实现 IDisposable 的对象时,您的代码都应该在 using 块内进行创建,如上所示。

这条规则有一个例外。WCF 代理类设计中的一个错误会阻止 using 语句对代理类有用。简而言之,代理类的 Dispose 方法可能会引发异常。WCF 团队认为没有理由不允许这样做。

不幸的是,没有看到原因并不意味着没有原因:

try
{
    using (var svc = new ServiceReference.ServiceName())
    {
        throw new Exception("Testing");
    }
}
catch (Exception ex)
{
    // What exception is caught here?
}

如果隐式 Dispose 调用引发异常,则 catch 块将捕获异常,而不是在using块中引发的异常。

于 2009-03-05T14:44:56.047 回答