2011-02-11 282 views
2

我想知道我的使用using是否正確。在using的規定,我決定是否應該在遊戲中使用圖像。我正確使用「using」語句嗎?

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

} 

從我的理解,我現在不需要調用Dispose

+0

好奇,在`使用`塊中發生了什麼? – BoltClock 2011-02-11 08:24:44

+0

只是一些檢查圖像是否是propriate。如果是這樣,我克隆它(因爲在那種情況下,我將需要該對象)。 – Tray13 2011-02-11 08:25:39

+0

提示:如果一個對象實現了`IDisposable`,那麼你應該幾乎總是使用`using`。 – Brian 2011-02-11 16:16:09

回答

0

使用是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處置呼叫。

9

是的,您正確使用它。您不需要明確處理位圖,因爲它將由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(); 
    } 
} 
0

它是正確的,如果圖像實現IDisposable接口。 using語句允許程序員指定何時使用資源的對象應釋放它們。提供給using語句的對象必須實現IDisposable接口。這個接口提供了Dispose方法,它應該釋放對象的資源。

0

是的確的,你是正確的使用它。請務必注意,當您安裝並使用它的對象實現IDisposable時,它非常有用。這確實是CLR爲我們做的一件簡潔的小東西,並且使代碼更清晰。 VB.Net現在也支持這種說法。據我所知,使用try catch塊的closin對象的使用語句之間沒有速度差異,但是我會建議使用tryin catch的usins語句,更乾淨的代碼,並且不要冒着忘記處理對象或因爲您沒有沒有發現任何異常