【问题标题】:Dispose found in existing C# code. Should I get rid of it?Dispose 在现有 C# 代码中找到。我应该摆脱它吗?
【发布时间】:2015-06-04 08:33:53
【问题描述】:

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

【问题讨论】:

标签: c# unity3d kinect dispose


【解决方案1】:

它具有自动垃圾收集功能,所以我的理解是 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();
        }
    }
}

【讨论】:

    【解决方案2】:

    它将在不确定的未来时间收集。如果该类已正确编写,它将包括对Dispose 的内部调用。

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-24
        • 2019-07-28
        • 2010-09-21
        • 2011-09-13
        相关资源
        最近更新 更多