在c#中存储引用

时间:2009-12-08 11:34:27

标签: c# reference-type

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

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

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

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
    }
}

这里的关键是我不是要试图改变这个类中的原始“外部”对象,我试图“重新命名”它,或者如果你愿意的话,可以初始化它。

3 个答案:

答案 0 :(得分:7)

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

目前还不清楚您想要使用它 - 您能否提供更多信息以便我们建议其他设计?任何依赖终结者的东西都是令人不安的,说实话......

答案 1 :(得分:4)

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

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

class Updater : IDisposable
{
    Action<object> setter;

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

    public Dispose()
    {
        setter(new object());
    }
}

答案 2 :(得分:1)

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

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