首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自我否定的物体?

问自我否定的物体?
EN

Stack Overflow用户
提问于 2014-08-06 11:43:05
回答 1查看 149关注 0票数 1

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

代码语言:javascript
复制
public class BaseObject
{
    bool isDeleted;

    public BaseObject()
    {
        isDeleted = false;
    }

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

该类保留一个布尔值,该值引用对象是否已被丢弃,而且理想情况下,如果此布尔值为真,则该对象在引用的任何位置都显示为null。

我不能让隐式转换超负荷到它自己的类型。

代码语言:javascript
复制
public static implicit operator BaseObject(BaseObject bo)
{
    if (bo.isDeleted) return null;
    else return bo;
}

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

理想情况下,如果isDeleted布尔值为真,我希望所有对从这个基类派生的对象的引用都返回null,而不管该对象是否实际存在。

任何帮助都非常感谢。

编辑:作为一个附带说明,我以前见过这种行为集成过,所以我知道它实际上是可能的。Unity包括一个基类,它使用引用包装器或其他东西来实现相同的功能,但我从未向我解释过它,也无法找到详细的解释。

Edit2:根据GregRos的评论,这个问题将主题转移到包装和阻止内存泄漏,然后使用IDisposable。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-06 13:46:07

执行注释中要求的最简单的方法是使用包装器对象。如果仅通过包装器访问内部资源,则一旦将包装字段设置为null,则基础资源将有资格进行垃圾收集。您还将能够精心处理当底层资源被释放时被请求的情况。包装器(和底层对象)应该实现IDisposable,如果底层资源未被保存,则可能有一个析构函数。

您应该小心地只通过包装器访问底层资源。否则,您可能会出现内存泄漏,比如某些lambda在引用上透明地关闭了。与其他语言相比,.NET中的内存泄漏甚至更难检测,尽管它们并不常见。

包装器可以是泛型的,所以您也可以将它用于子类。

您最初提议的方式在理论上也不能工作,因为它需要以某种方式神奇地设置所有包含对null对象的引用的字段。简单地将对象“处理”为null,即使这是语言所支持的,也是行不通的。不过,语言不支持它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25159527

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档