2015-06-04 15 views
1

我在使用Kinect v2的Unity3D項目中找到了下面的代碼,我接管了它。我很偏執,所以我想在刪除它之前檢查一下。 但是,這兩條線肯定沒有理由?在現有的C#代碼中找到Dispose。我應該擺脫它嗎?

colorFrame.Dispose(); 
colorFrame = null; 

這是C#。它具有自動垃圾收集,所以我的理解是,當它的方便,如果(的getRGB)語句之外

if (GetRGB) 
{ 
    ColorFrame colorFrame = frame.ColorFrameReference.AcquireFrame(); 
    if (colorFrame != null) 
    { 
     colorFrame.CopyConvertedFrameDataToArray (_ColorData, ColorImageFormat.Rgba); 
     _ColorTexture.LoadRawTextureData (_ColorData); 
     _ColorTexture.Apply(); 
     colorFrame.Dispose(); 
     colorFrame = null; 
    } 
} 
+0

[您是否需要處理對象並將它們設置爲null?](http://stackoverflow.com/questions/2926869/do-you-need-to-dispose-of-objects-and-設置他們對空) –

回答

4

它具有自動垃圾收集,所以我的理解是, colorFrame將被處置時colorFrame將被佈置其方便 如果(的getRGB)語句

之外的對象將再次在GC踢清洗(在非確定性的時間),並認爲沒有根的colorFrame對象。在一個對象上調用Dispose通常會釋放由同一對象分配的非託管資源,並且會調用GC.SupressFinalize,這會使得任何對象都從終結隊列中取消註冊,允許GC「更快」地對其進行清理。

我建議保持呼叫Dispose。我會刪除colorFrame = null的呼叫,這是沒用的。

更妙的是,在using聲明包裝colorFrame

if (GetRGB) 
{ 
    using (ColorFrame colorFrame = frame.ColorFrameReference.AcquireFrame()) 
    { 
     if (colorFrame != null) 
     { 
      colorFrame.CopyConvertedFrameDataToArray(_ColorData, ColorImageFormat.Rgba); 
      _ColorTexture.LoadRawTextureData(_ColorData); 
      _ColorTexture.Apply(); 
     } 
    } 
} 
1

這將是在一個不確定的未來時收集垃圾。如果班級寫入正確,它將包含內部電話Dispose

然而,你應該始終調用DisposeIDisposable對象(或更好,使用using塊)因爲這樣,他們可以釋放他們目前持有任何非託管資源,而無需等待執行垃圾回收的框架。

0

垃圾收集是CLR的一部分。 IDisposable是一個任意的接口,用於清理類在完成其生命週期時使用的資源。不要移除垃圾!該框架對Dipose()不知道,並且不會調用它。

相關問題