在现有的C#代码中找到的处理。我应该摆脱它吗?

时间:2015-06-04 08:33:54

标签: c# unity3d kinect dispose

我使用我接手的Kinect v2在Unity3D项目中找到了以下代码。我是偏执狂,所以我想在删除它之前先检查一下。 但肯定没有理由这两行?

colorFrame.Dispose();
colorFrame = null;

这是C#。它有自动垃圾收集,所以我的理解是colorFrame将在if(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;
    }
}

3 个答案:

答案 0 :(得分:4)

  

它有自动垃圾收集,所以我的理解是这样的   colorFrame将在其方便的外部处理   if(GetRGB)语句

一旦GC启动(在非确定性时间)并且看到colorFrame对象没有根,将清理该对象。在对象上调用Dispose通常会释放由同一对象分配的非托管资源,以及调用GC.SupressFinalize,这会使任何具有终结器的对象从终结队列中注销,从而允许GC清理它“更快”。

我建议保留对Dispose的电话。我会删除colorFrame = null来电,这是无用的。

更好的是,将colorFrame包裹在using语句中:

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

答案 1 :(得分:1)

将在非确定性的未来时间垃圾收集。如果该类已正确编写,则将包含对Dispose的内部调用。

但是,您应该始终在Dispose个对象上调用using(或更好,使用IDisposable块),因为他们可以释放他们当前持有的任何非托管资源,而无需等待框架执行垃圾收集。

答案 2 :(得分:0)

垃圾收集是CLR的一部分。 IDisposable是一个任意接口,用于在类完成其生命时清理类使用的资源。不要删除!该框架对Dipose()一无所知,也不会调用它。