在C#中使用using语句

时间:2009-03-05 14:23:23

标签: c# using

  

可能重复:
  What is the C# Using block and why should I use it?

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

6 个答案:

答案 0 :(得分:41)

使用语法可以(应该)用作为实现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();
    }

Extra reading from MSDN

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

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

答案 1 :(得分:3)

打开与流或数据库的连接时经常使用它。

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

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


}

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

答案 2 :(得分:3)

使用是最后尝试语法suger任何具有IDisposable的东西..像sqlconnection。它的用途是确保在using(){}范围之后处理某些东西。

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

//shorter than

SqlConnection conn = new SqlConnection(connString)
try
{
  //use connection 
}
finally
{
    conn.Dispose();
}

答案 3 :(得分:2)

using语句确保一旦不再需要对象就可以正确处理。 它基本上可以节省你写obj.Dispose();并提供有关变量范围和用法的可视指南。

有关详细信息,请参阅the MSDN page

答案 4 :(得分:2)

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

示例:

using(SqlConnection conn = new SqlConnection(someConnectionString))
{
     //Do some database stuff here
}
在使用块conn的末尾

。即使在块内抛出异常,也会调用Dispose。对于SwqlConnection对象,意味着连接始终处于关闭状态。

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

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

答案 5 :(得分:2)

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

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

不幸的是,没有理由并不意味着 没有理由:

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

如果隐式Dispose调用抛出异常,那么catch块将捕获异常,而不是使用块中抛出的异常。