我正确使用“使用”声明吗?

时间:2011-02-11 08:23:20

标签: c# .net using-statement

我想知道我对using的使用是否正确。在using状态中,我决定是否应该在游戏中使用该图像。

Image imageOfEnemy;
using(imageOfEnemy=Bitmap.FromFile(path))
{
   // some stuff with the imageOfEnemy variable

}

根据我的理解,我现在不需要致电Dispose

4 个答案:

答案 0 :(得分:9)

是的,您正确使用它。您不需要显式处理Bitmap,因为它将由using语句处理。您可以通过在内部声明图像变量来进一步简化:

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();
    }
}

答案 1 :(得分:0)

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

答案 2 :(得分:0)

using 是IDisposable对象的简写语句,用于简化try-finally块,在finally块中使用Dispose。

http://msdn.microsoft.com/en-us/library/yh598w02.aspx

所以是的,在这种情况下你不必手动调用Dispose。

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
        }
    }
}

Main方法将在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
}

即使您是MSIL新手,也可以看到try-finally处理程序和Dispose调用。

答案 3 :(得分:0)

是的,你确实以正确的方式使用它。请注意,虽然在实现IDisposable时实例化并使用它的对象很有用。这真的是 CLR为我们做的一件简洁的事情,使代码更清晰。 VB.Net现在也支持这个声明。根据我的知识,使用try catch块的closin对象的using语句之间没有速度差异,但是我建议使用try-catch,更干净的代码的usins语句,并且你不会冒险忘记丢弃对象或因为你没有没有发现异常