7

我正在尝试设计一个类,它可以在销毁时更新对对象(类外)的引用。

所以本质上你创建了这个对象的一个​​实例并传递给它一个引用类型(以任何方式,构造函数等),然后在对象销毁时,原始引用已更改为由对象创建的引用。

如果我通过引用传递引用(例如在构造中),我无法找到一种方法来存储这个引用(作为引用)以供析构函数更新它?例如(伪):

class Updater
{
    object privateReference;
    public Updater(ref object externalReference)
    {
        privateReference = externalReference; //is privateReference now a new reference to the original object?
    }

    ~Updater()
    {
        privateReference = new object(); //therefore this isn't 'repointing' the externalReference
    }
}

这里的关键是我不想从这个类中改变原始的“外部”对象,我想“重新指向”它,或者如果你愿意的话将它初始化。

4

3 回答 3

8

你不能这样做,基本上。ref仅适用于方法本身,有效。

完全不清楚你想用这个做什么——你能给我们更多信息,以便我们建议替代设计吗?老实说,任何依赖终结器的东西一开始都很麻烦......

于 2009-12-08T11:39:09.160 回答
5

这不起作用,因为ref构造函数参数的方面仅适用于构造函数内部。

我要做的是给构造函数一个委托,它可以用来更新有问题的东西。此外,您应该使用IDisposable它(与using块一起使用)而不是终结器;终结器不应触及托管对象(它们旨在释放非托管对象)。

class Updater : IDisposable
{
    Action<object> setter;

    public Updater(Action<object> setter)
    {
        this.setter = setter;
    }

    public Dispose()
    {
        setter(new object());
    }
}
于 2009-12-08T11:40:33.957 回答
2

请注意,使用这样的终结器与 C++ 中的析构函数不同。

当最后一个引用终止时(可能它超出范围),对象进入 Finalizer 队列。GC 确定何时调用终结器,并且可能在最后一个引用终止后很长时间。

于 2009-12-08T11:39:18.677 回答