c#在托管和非托管资源中使用关键字用法

时间:2013-01-03 21:05:13

标签: c#

using关键字用于正确处理托管资源和非托管资源。

我对何时使用using关键字感到困惑。

例如,using用于托管资源,例如Connection对象。

它用于非托管资源,如下所示:

   using (Font font1 = new Font("Arial", 10.0f)) 
   {
       byte charset = font1.GdiCharSet;
   }

使用using关键字时是否有一般的经验法则? 是否应该用于所有物体,以便妥善处理? 如何判断哪些对象是using关键字的主要候选者?

4 个答案:

答案 0 :(得分:5)

  

使用使用时是否有一般的经验法则?

您应该在任何实现IDisposable的类上使用它,无论资源是托管还是非托管。

来自MSDN

  

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

答案 1 :(得分:1)

通常,您应该在类实现IDisposable时使用它。但是,有一些边缘情况可以避免,例如当您使用WCF, as explained here时。此外,如果您需要在类中的其他位置访问该对象,则不能使用using,因为它限制了对象的范围,因此您应该显式处置对象。

答案 2 :(得分:0)

我的一般经验法则:如果可以使用它,请使用它。

什么时候可以使用?简而言之,当对象实现IDisposable并且您在方法结束时已经完成使用它。

一个值得注意的例外是Web服务客户端(例如,WCF服务) - 默认实现可能导致实际错误消息丢失。 (例如,见http://www.codeproject.com/Tips/197531/Do-not-use-using-for-WCF-Clients

答案 3 :(得分:0)

上面描述的using关键字只会在超出范围时调用font1上的Dispose。

尽管可能存在异常,但我认为您可以安全地假设当一个类实现IDisposable时,您应该在完成对象时调用Dispose。

上面显示的结构将为您完成。在其他情况下,您可能无法使用use,因为对象的生命周期超过了您创建它的函数的生命周期。在这种情况下,手动处理它是明智的。

亲切的问候, Marwijn。