我希望能够为我正在处理的项目创建一个基类--所有其他类都会从中派生出来。它看起来会像这样;
public class BaseObject
{
bool isDeleted;
public BaseObject()
{
isDeleted = false;
}
public void Delete()
{
isDeleted = true;
}
}该类保留一个布尔值,该值引用对象是否已被丢弃,而且理想情况下,如果此布尔值为真,则该对象在引用的任何位置都显示为null。
我不能让隐式转换超负荷到它自己的类型。
public static implicit operator BaseObject(BaseObject bo)
{
if (bo.isDeleted) return null;
else return bo;
}...because引用类型与转换类型相同。很遗憾,因为这样可以完美地实现行为。
理想情况下,如果isDeleted布尔值为真,我希望所有对从这个基类派生的对象的引用都返回null,而不管该对象是否实际存在。
任何帮助都非常感谢。
编辑:作为一个附带说明,我以前见过这种行为集成过,所以我知道它实际上是可能的。Unity包括一个基类,它使用引用包装器或其他东西来实现相同的功能,但我从未向我解释过它,也无法找到详细的解释。
Edit2:根据GregRos的评论,这个问题将主题转移到包装和阻止内存泄漏,然后使用IDisposable。
发布于 2014-08-06 13:46:07
执行注释中要求的最简单的方法是使用包装器对象。如果仅通过包装器访问内部资源,则一旦将包装字段设置为null,则基础资源将有资格进行垃圾收集。您还将能够精心处理当底层资源被释放时被请求的情况。包装器(和底层对象)应该实现IDisposable,如果底层资源未被保存,则可能有一个析构函数。
您应该小心地只通过包装器访问底层资源。否则,您可能会出现内存泄漏,比如某些lambda在引用上透明地关闭了。与其他语言相比,.NET中的内存泄漏甚至更难检测,尽管它们并不常见。
包装器可以是泛型的,所以您也可以将它用于子类。
您最初提议的方式在理论上也不能工作,因为它需要以某种方式神奇地设置所有包含对null对象的引用的字段。简单地将对象“处理”为null,即使这是语言所支持的,也是行不通的。不过,语言不支持它。
https://stackoverflow.com/questions/25159527
复制相似问题