在现有C#代码中找到Dispose。我应该把它扔掉吗?

在现有C#代码中找到Dispose。我应该把它扔掉吗?,c#,unity3d,kinect,dispose,C#,Unity3d,Kinect,Dispose,我在一个使用Kinect v2的Unity3D项目中发现了以下代码,我已经接管了该项目。我有妄想症,所以我想在删除它之前先检查一下。 但肯定没有理由说这两行话 colorFrame.Dispose(); colorFrame = null; 这是C。它具有自动垃圾收集功能,所以我的理解是,当colorFrame在if(GetRGB)语句之外方便时,它将被处理 if (GetRGB) { ColorFrame colorFrame = frame.ColorFrameReference.

我在一个使用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;
    }
}
它有自动垃圾收集功能,所以我的理解是 色框将在其方便的外部进行处理 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;
    }
}
一旦GC启动(在不确定的时间)并看到
colorFrame
对象没有根,对象就会被清理。在对象上调用
Dispose
通常会释放由同一对象分配的非托管资源,以及调用
GC.superssFinalize
,这会使任何具有终结器的对象从终结队列中注销,从而使GC能够“更快”清理它

我建议您继续拨打
Dispose
。我将删除
colorFrame=null
调用,这是无用的

更好的方法是,使用语句将
colorFrame
包装在
中:

if (GetRGB)
{
    using (ColorFrame colorFrame = frame.ColorFrameReference.AcquireFrame()) 
    {
        if (colorFrame != null)
        {
           colorFrame.CopyConvertedFrameDataToArray(_ColorData, ColorImageFormat.Rgba);
           _ColorTexture.LoadRawTextureData(_ColorData);
           _ColorTexture.Apply();
        }
    }
}
它有自动垃圾收集功能,所以我的理解是 色框将在其方便的外部进行处理 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;
    }
}
一旦GC启动(在不确定的时间)并看到
colorFrame
对象没有根,对象就会被清理。在对象上调用
Dispose
通常会释放由同一对象分配的非托管资源,以及调用
GC.superssFinalize
,这会使任何具有终结器的对象从终结队列中注销,从而使GC能够“更快”清理它

我建议您继续拨打
Dispose
。我将删除
colorFrame=null
调用,这是无用的

更好的方法是,使用
语句将
colorFrame
包装在
中:

if (GetRGB)
{
    using (ColorFrame colorFrame = frame.ColorFrameReference.AcquireFrame()) 
    {
        if (colorFrame != null)
        {
           colorFrame.CopyConvertedFrameDataToArray(_ColorData, ColorImageFormat.Rgba);
           _ColorTexture.LoadRawTextureData(_ColorData);
           _ColorTexture.Apply();
        }
    }
}
它将在不确定的未来时间进行垃圾收集。如果类编写正确,它将包括对
Dispose
的内部调用

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

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


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

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

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

的可能重复