自我无效的对象?

时间:2014-08-06 11:43:06

标签: c#

我希望能够为我正在进行的项目创建基类 - 所有其他类都将从中派生出来。它看起来像这样;

public class BaseObject
{
    bool isDeleted;

    public BaseObject()
    {
        isDeleted = false;
    }

    public void Delete()
    {
        isDeleted = true;
    }
}

该类保留一个布尔值,该值引用该对象是否已被丢弃,理想情况下,如果此布尔值为true,则无论引用该对象,该对象都将显示为null。

我无法将隐式转换重载为自己的类型,如此......

public static implicit operator BaseObject(BaseObject bo)
{
    if (bo.isDeleted) return null;
    else return bo;
}

...因为引用类型与转换类型相同。遗憾,因为这样可以完美地实现这种行为。

理想情况下,如果isDeleted布尔值为true,则无论对象是否实际存在,我都希望对从此基类派生的对象的所有引用返回null。

非常感谢任何帮助。

编辑:作为旁注;我之前已经看到过这种行为,所以我知道它实际上是可行的。 Unity API包含一个基础Object类,它使用引用包装器或其他东西来实现相同的功能,但我从来没有向它解释过,我也找不到详细的解释。

Edit2:根据GregRos'注释,问题将主题转移到包装器并停止内存泄漏,然后使用IDisposable。

1 个答案:

答案 0 :(得分:0)

在评论中执行操作的最简单方法是使用包装器对象。如果通过包装器专门访问内部资源,则将包装字段设置为null后,底层资源将有资格进行垃圾回收。您还可以精心处理发布时请求底层资源的情况。如果底层资源是非托管的,那么包装器(和底层对象)应该实现IDisposable并且可能有一个析构函数。

你应该小心翼翼地只通过包装器访问底层资源。否则,您最终可能会遇到内存泄漏,例如,如果某个lambda透明地关闭了引用。 .NET中的内存泄漏比其他语言更难以检测,尽管它们不太常见。

包装器可以是通用的,因此您也可以将它用于子类。

您最初提出的方式即使在理论上也无法工作,因为它需要以某种方式神奇地将包含对象引用的所有字段设置为null。简单地治疗'对象为null,即使语言支持,也不会起作用。但是,该语言不支持。