我正确使用“using”语句吗?
问题描述:
我想知道我的使用using
是否正确。在using
的规定,我决定是否应该在游戏中使用图像。我正确使用“using”语句吗?
Image imageOfEnemy;
using(imageOfEnemy=Bitmap.FromFile(path))
{
// some stuff with the imageOfEnemy variable
}
从我的理解,我现在不需要调用Dispose
。
答
使用是IDisposable对象的简写语句,用于简化try-finally块,在finally块中使用Dispose。
http://msdn.microsoft.com/en-us/library/yh598w02.aspx
所以,是的,你没有在这种情况下所说的“手动”处置。
using System;
namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
using (var example = new Example())
{
//do something
}
}
}
class Example : IDisposable
{
public void Dispose()
{
//Do something
}
}
}
主要方法将是在MSIL:
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
.maxstack 2
.locals init (
[0] class ConsoleApplication3.Example example,
[1] bool CS$4$0000)
L_0000: nop
L_0001: newobj instance void ConsoleApplication3.Example::.ctor()
L_0006: stloc.0
L_0007: nop
L_0008: nop
L_0009: leave.s L_001b
L_000b: ldloc.0
L_000c: ldnull
L_000d: ceq
L_000f: stloc.1
L_0010: ldloc.1
L_0011: brtrue.s L_001a
L_0013: ldloc.0
L_0014: callvirt instance void [mscorlib]System.IDisposable::Dispose()
L_0019: nop
L_001a: endfinally
L_001b: nop
L_001c: ret
.try L_0007 to L_000b finally handler L_000b to L_001b
}
你可以看到在try-最后处理程序,即使你是新来的MSIL处置呼叫。
答
是的,您正确使用它。您不需要明确处理位图,因为它将由using
声明处置。您可以通过内声明image变量进一步简化:
using(var imageOfEnemy = Bitmap.FromFile(path))
{
// some stuff with the imageOfEnemy variable
}
这大致相当于:
{
var imageOfEnemy = Bitmap.FromFile(path);
try
{
// some stuff with the imageOfEnemy variable
}
finally
{
((IDisposable)imageOfEnemy).Dispose();
}
}
答
它是正确的,如果图像实现IDisposable接口。 using语句允许程序员指定何时使用资源的对象应释放它们。提供给using语句的对象必须实现IDisposable接口。这个接口提供了Dispose方法,它应该释放对象的资源。
答
是的确的,你是正确的使用它。请务必注意,当您安装并使用它的对象实现IDisposable时,它非常有用。这确实是CLR为我们做的一件简洁的小东西,并且使代码更清晰。 VB.Net现在也支持这种说法。据我所知,使用try catch块的closin对象的使用语句之间没有速度差异,但是我会建议使用tryin catch的usins语句,更干净的代码,并且不要冒着忘记处理对象或因为您没有没有发现任何异常
好奇,在`使用`块中发生了什么? – BoltClock 2011-02-11 08:24:44
只是一些检查图像是否是propriate。如果是这样,我克隆它(因为在那种情况下,我将需要该对象)。 – Tray13 2011-02-11 08:25:39
提示:如果一个对象实现了`IDisposable`,那么你应该几乎总是使用`using`。 – Brian 2011-02-11 16:16:09