using关键字用于正确处理托管资源和非托管资源。
我对何时使用using关键字感到困惑。
例如,using用于托管资源,例如Connection对象。
它用于非托管资源,如下所示:
using (Font font1 = new Font("Arial", 10.0f))
{
byte charset = font1.GdiCharSet;
}
使用using关键字时是否有一般的经验法则? 是否应该用于所有物体,以便妥善处理? 如何判断哪些对象是using关键字的主要候选者?
答案 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。