我使用我接手的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;
}
}
答案 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()一无所知,也不会调用它。