0

即使它有引用(c# 或 Java),我如何删除对象?

例如:

void Main()
{
    var f = new Foo();
    var person = f.GetPerson();

}

public class Foo
{
    private object _person;

    public Foo()
    {
        _person = new object();
    }

    public object GetPerson()
    {  
         return _person;
    }
}

我想从内存中删除 _person 我该怎么做?

4

3 回答 3

11

你不能,简单地说。

如果您确实想实现类似的目标,您可以Person通过代理引用您的,并传递代理。因此,您可以将基础 Person 引用设置为 null(仅表明该对象可用于删除 -强制删除),但客户端仍将包含代理引用。

您可能想查看Java SoftReferences 和 WeakReferences,它们是相关的,并且可以在垃圾回收周期中丢弃对象,尽管它们的弱/软引用在其他地方可用。

于 2013-05-17T11:01:34.883 回答
1

您不能通过托管语言中的引用从内存中删除对象。

您可以通过将引用设置为 Null 并调用 GC.Collect() 从 C# 中的内存中删除它

于 2013-05-17T11:05:06.493 回答
1

基本上,您想使活的参考无效。这将打破具有自动内存管理的语言的关键假设,即不可能取消引用无效指针。至少在 Java 中这肯定是不可能的,我邀请 C# 专家为这个社区 wiki 贡献 C# 特定信息。

针对您的要求的解决方案:您必须将对对象的引用封装在另一个对象中,并且永远不要让引用逃逸,以确保该引用的 100% 所有权。所以外部对象需要复制内部对象的完整 API,基本上是装饰器模式。

如果您这样做,您将可以选择随时设置内部引用null,从而可靠地释放对象。

于 2013-05-17T11:19:28.920 回答