在现有 C# 代码中发现的 Dispose。我应该摆脱它吗?

Dispose found in existing C# code. Should I get rid of it?

我在接管的使用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;
    }
}

It has automatic garbage collection so my understanding is that colorFrame will be disposed when its convenient outside of the if(GetRGB) statement

一旦 GC 启动(在不确定的时间)并且发现 colorFrame 对象没有根,该对象将被清除。在对象上调用 Dispose 通常会释放由同一对象分配的非托管资源,调用 GC.SupressFinalize 也会释放任何具有终结器的对象从终结队列中注销,从而允许 GC 清理起来 "faster".

我建议继续拨打 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();
        }
    }
}

它将在不确定的未来时间被垃圾收集。如果 class 写入正确,它将包含对 Dispose 的内部调用。

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

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