我希望能够为我正在进行的项目创建基类 - 所有其他类都将从中派生出来。它看起来像这样;
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。
答案 0 :(得分:0)
在评论中执行操作的最简单方法是使用包装器对象。如果通过包装器专门访问内部资源,则将包装字段设置为null后,底层资源将有资格进行垃圾回收。您还可以精心处理发布时请求底层资源的情况。如果底层资源是非托管的,那么包装器(和底层对象)应该实现IDisposable
并且可能有一个析构函数。
你应该小心翼翼地只通过包装器访问底层资源。否则,您最终可能会遇到内存泄漏,例如,如果某个lambda透明地关闭了引用。 .NET中的内存泄漏比其他语言更难以检测,尽管它们不太常见。
包装器可以是通用的,因此您也可以将它用于子类。
您最初提出的方式即使在理论上也无法工作,因为它需要以某种方式神奇地将包含对象引用的所有字段设置为null
。简单地治疗'对象为null
,即使语言支持,也不会起作用。但是,该语言不支持。