共享对象之间的引用

时间:2010-07-08 15:20:00

标签: c# reference

我想让多个对象通过私有字段共享引用,这样任何对象都可以分配给该字段,并且共享该引用的其他对象将看到更新的字段。我原本希望做的是:

class SomeObject
{
    private ref DataObject _data;
    public SomeObject(ref DataObject data)
    {
         _data = ref data; // or something similar
    }

    public ChangeData(DataObject newData)
    {
         _data = data;
         // at this point, *other* SomeObject instances that were
         // created with the same reference should also have _data == newData
    }
}

但当然你不能那样使用refref仅用于方法参数。并且静态字段将不起作用,因为所有 SomeObject实例都不应该引用相同的对象 - 相反,应该在构造函数中设置相关对象。

显然,我可以通过添加一个简单的包装类来解决这个问题。但有更好的方法吗?我可以使用某种SharedReference<T>类吗?

更新,因为大多数答案都误解了我的要求。我知道_data字段包含原始DataObject引用。我想要的是另一层次的间接。我希望能够在一个实例中更改我指向的对象,并使用相同引用创建的其他实例获取新值。如更新的代码示例所示,我想分配给_data,并在其他情况下有效地更改_data的值。

4 个答案:

答案 0 :(得分:4)

我不知道你可以使用任何类,但我似乎很容易实现你自己的SharedReference<T>类。

这样的事情:

public sealed class SharedReference<T>
    where T : class
{
    public T Reference
    {
        get; set;
    }
}

答案 1 :(得分:1)

如果您只是在没有ref关键字的情况下提供对象的引用,您将获得所需的行为。使用ref实际上是传递对引用的引用(指向指针的指针),所以除非你想null别人的引用,否则对你没有任何用处。

更新抱歉,我没有发现您想要将一个全新的对象重新分配到该字段中,并在整个过程中反映出来。您最好创建一个包装类以包含对象 state 并修改它,或者所有实例都可以订阅的公共事件,以便在您想要更改对象时,使用其中的新对象,并让每个实例更新它自己的内部引用。

或者,使用Singleton模式 - 每个人都可以访问公开的静态引用,但与传统的Singleton不同,您可以让他们根据需要更改引用 - 这样每个人都可以看到更改。这样做的好处是对象不需要内部引用。

或者,再次,让数据类公开一个方法,允许它使用另一个数据类并复制其状态 - 比如克隆。

答案 2 :(得分:1)

您可以简单地使用共享对象数组,并重新分配数组元素:

class SomeObject
{
    // you probably want to make this readonly
    private readonly DataObject[] _data;     

    public SomeObject(DataObject[] data)
    {
         _data = data;
    }

    public void ChangeData(DataObject newData)
    {
        _data[0] = o;
    }

    // and you could define your own accessor property...
    private DataObject Data
    {
        get { return _data[0]; }
        set { _data[0] = value; }
    }
}

除此之外,我认为你需要定义自己的'持有人'班级&amp;用那个

答案 3 :(得分:0)

在C#中,


class SomeObject
{
    private DataObject _data;
    public SomeObject(DataObject data)
    {
         _data = data;
    }
}
如果DataObject是一个引用类型,

实际上完全符合你的要求,对所有类都适用。

由于我误解了最初的问题,请忽略这个答案。
其他答案完全涵盖了这个主题。