C# Unity游戏对象是托管资源还是非托管资源?

C# Unity游戏对象是托管资源还是非托管资源?,c#,unity3d,idisposable,C#,Unity3d,Idisposable,我有一个类,它实例化了场景层次中的几个unity游戏对象。此类实现IDisposable。我应该在这些游戏对象是托管资源还是非托管资源时处理它们 我正在跟踪,那么我应该把像GameObject.Destroy(myGameObject)这样的调用放在哪里呢 多谢各位 编辑: 好的,假设我想在这个类超出范围时销毁它实例化的游戏对象。那你怎么办 编辑2: 我在测试这个系统。我找到了一个解决方案。它不会自动工作,因为不能从不同的线程调用GameObject.Destroy(myGameObject)。

我有一个类,它实例化了场景层次中的几个unity游戏对象。此类实现IDisposable。我应该在这些游戏对象是托管资源还是非托管资源时处理它们

我正在跟踪,那么我应该把像GameObject.Destroy(myGameObject)这样的调用放在哪里呢

多谢各位

编辑: 好的,假设我想在这个类超出范围时销毁它实例化的游戏对象。那你怎么办

编辑2: 我在测试这个系统。我找到了一个解决方案。它不会自动工作,因为不能从不同的线程调用GameObject.Destroy(myGameObject)。它将在内部抛出一个错误CompareBaseObjects。因此,当不再需要时,我调用myClass.Dispose()。此外,我是否将Unity GameObject处理为托管还是非托管似乎也无关紧要

myMain()
{
    DisposeTestClass test = new DisposeTestClass();
    //...
    test.Dispose();
}


class DisposeTestClass : System.IDisposable
{

    public GameObject uselessGameobject { get; private set; }

    public DisposeTestClass()
    {           
        uselessGameobject = new GameObject("Useless gameobject");
    }

    #region IDisposable
    private bool _disposed;

    ~DisposeTestClass()
    {
        Debug.Log("~DisposeTestClass()");

        this.Dispose(false);
    }

    public void Dispose()
    {
        Debug.Log("Dispose()");

        this.Dispose(true);
        System.GC.SuppressFinalize(this);

    }

    protected virtual void Dispose(bool disposing)
    {
        Debug.Log("Dispose(bool)");

        if(_disposed)
        {
            Debug.Log("Disposed. Return.");
            return;
        }           

        if(disposing)
        {
            Debug.Log("Disposing of managed resources...");

            // clean up managed resources
            /*
            if(uselessGameobject != null)
            {
                GameObject.Destroy(uselessGameobject);
                Debug.Log("Game object destroyed.");
            }
            else
            {
                Debug.Log("Game object is null.");
            }*/

        }

        Debug.Log("Cleaning up unmanaged resources...");
        // clean up unmanaged resources

        if(uselessGameobject != null)
        {
            GameObject.Destroy(uselessGameobject);
            Debug.Log("Game object destroyed.");
        }
        else
        {
            Debug.Log("Game object is null.");
        }

        // set the flag
        Debug.Log("Setting the disposed flag.");
        this._disposed = true;
    }
    #endregion

}

}不,您不应该实现IDisposable。但是你可以:)

“那么我应该把调用GameObject.Destroy(myGameObject)”放在哪里?你想什么时候销毁你的对象?实际上,无论您调用myContainer.Dispose()还是GameObject.Destroy(gObj),这都无关紧要

实现IDisposable的唯一原因是编写“方便”的代码,如:

using(var container = new MyContainer())
using(var somethingElse = new MyObject())
{
    \\Logic for container and somethingElse 
}

但在统一中,这毫无意义。我很难想象在更新游戏中对象被创建然后被销毁的情况。

不,你不应该实现IDisposable。但是你可以:)

“那么我应该把调用GameObject.Destroy(myGameObject)”放在哪里?你想什么时候销毁你的对象?实际上,无论您调用myContainer.Dispose()还是GameObject.Destroy(gObj),这都无关紧要

实现IDisposable的唯一原因是编写“方便”的代码,如:

using(var container = new MyContainer())
using(var somethingElse = new MyObject())
{
    \\Logic for container and somethingElse 
}

但在统一中,这毫无意义。我很难想象在更新游戏中,对象被创建然后被销毁的情况。

嗯,我想你们有点误解了
IDisposable
using
语句的用途。您不应该在任何地方都实现
IDisposable
,而仅仅是为了除去一个对象——这是垃圾收集器的角色,它更清楚对象何时被丢弃

IDisposable
using
语句用作
try/finally
语句(当然,它在引擎盖下要复杂得多),并确保对象不再使用后立即移除/解析。它并不总是托管/非托管资源问题

使用
使用
语句不能确保您的游戏对象将被处置。这完全取决于是否有其他物体指向它。因为它看起来像一个根对象,我相信它将被GC尽可能长时间地持有。请注意,即使GC调用对象上的
Dispose()
,只要它被引用,它将一直保留在特殊队列中,直到它被释放

另一方面,如果你的<代码>游戏对象< /代码>较少<<代码>游戏>代码>,<>代码>对象< /> >,你不应该考虑使用<代码> IDISPOSTABLE < /C> >,只要它没有与某个连接/文件/外部资源连接。一旦您的对象被认为是垃圾,GC就会声明内存。只要考虑一下,

IDisposable
是CLR对待的有点不同的东西,并不总是要走的路

编辑


根据您在edit中提出的问题——基本上,当对象超出范围时,您什么也不做——如果GC认为它是垃圾,它将与发生的最近的GC收集一起被删除。这就是C#被认为是托管语言的原因,也是您不自行释放内存的原因。

嗯,我想您稍微误解了
IDisposable
using
语句的用途。您不应该在任何地方都实现
IDisposable
,而仅仅是为了除去一个对象——这是垃圾收集器的角色,它更清楚对象何时被丢弃

IDisposable
using
语句用作
try/finally
语句(当然,它在引擎盖下要复杂得多),并确保对象不再使用后立即移除/解析。它并不总是托管/非托管资源问题

使用
使用
语句不能确保您的游戏对象将被处置。这完全取决于是否有其他物体指向它。因为它看起来像一个根对象,我相信它将被GC尽可能长时间地持有。请注意,即使GC调用对象上的
Dispose()
,只要它被引用,它将一直保留在特殊队列中,直到它被释放

另一方面,如果你的<代码>游戏对象< /代码>较少<<代码>游戏>代码>,<>代码>对象< /> >,你不应该考虑使用<代码> IDISPOSTABLE < /C> >,只要它没有与某个连接/文件/外部资源连接。一旦您的对象被认为是垃圾,GC就会声明内存。只要考虑一下,

IDisposable
是CLR对待的有点不同的东西,并不总是要走的路

编辑


根据您在edit中提出的问题——基本上,当对象超出范围时,您什么也不做——如果GC认为它是垃圾,它将与发生的最近的GC收集一起被删除。这就是为什么C#被认为是托管语言,也就是为什么你不自己释放内存。

我理解你对垃圾收集器的看法,请参阅我的编辑。即使类的实例超出范围,类创建的游戏对象仍然存在于场景中。我可以编写一个名为Cleanup或MyDispose的方法来销毁游戏对象,并在我不打算处理类的实例后手动调用它。但在Dispose中处理销毁会很方便