在对象之间共享引用

4
我希望多个对象能够通过一个私有字段共享引用,这样任何一个对象都可以分配给该字段,更新后的字段将被共享该引用的其他对象看到。我最初希望做的事情是这样的:
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
    }
}

当然,您不能以这种方式使用ref: ref仅适用于方法参数。静态字段也行不通,因为并非所有SomeObject实例都应该引用同一个对象——相反,应该在构造函数中设置该对象。
显然,我可以通过添加一个简单的包装类来解决这个问题。但是有没有更好的方法?是否有一种可以使用的SharedReference<T>类?
更新,由于大多数答案误解了我的问题。我知道_data字段包含对原始DataObject的引用。我想要另一层间接性。我想能够在一个实例中更改指向的对象,并使其他使用相同引用创建的实例选择新值。正如更新后的代码示例所示,我想分配给_data,并有效地更改其他实例中_data的值。

你如何定义哪些对象共享引用,哪些具有自己的实例? - cjk
4个回答

5

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

像这样:

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

我可以使用这个。我只是为了额外的方便添加了一个 implicit operator T - JSBձոգչ

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

除此之外,我认为你需要定义自己的“holder”类并使用它。

这是第一个真正理解问题的答案。谢谢 :)。 - JSBձոգչ
@JS Bangs 我没有注意到赋值部分 - 我立刻读成了“改变状态”,哈哈,我修改了我的答案。在我看来,使用数组并不是一个很好的选择,因为它比其他方法更难以阅读。 - Adam Houldsworth

1

如果你只是提供一个对象的引用而没有使用ref关键字,那么你将得到你想要的行为。使用ref实际上是传递了一个引用到引用(指针到指针),所以除非你想要将别人的引用设置为null,否则它对你没有任何用处。

更新:抱歉我没有注意到你想要重新分配一个全新的对象到字段中并在整个过程中反映出来。你最好创建一个包含对象状态的包装类并修改它,或者创建一个所有实例都可以订阅的公共事件,这样当你想要改变对象时,就可以触发带有新对象的事件,并让每个实例更新自己的内部引用。

另外,使用单例模式-每个人都可以访问一个公开可用的静态引用,但与传统的单例不同的是,你可以让他们改变引用-这样每个人都可以看到变化。这也有一个好处,即对象不需要内部引用。

再次提醒,数据类可以公开一种方法,允许它消耗另一个数据类并将其状态复制过去-就像克隆一样。


不,他想完全重新分配该字段。 - thecoop

0

在C#中,

<del>
class SomeObject
{
    private DataObject _data;
    public SomeObject(DataObject data)
    {
         _data = data;
    }
}
</del>

实际上它会完全满足你的需求,如果DataObject是引用类型,这对于所有类来说都是正确的。

请忽略此答案,因为我误解了最初的问题。
其他答案已经全面涵盖了这个主题。


不,他想完全重新分配该字段。 - thecoop
@thecoop请移除负评。我的帖子发布后问题被更新,而且最初的问题含义不明确。我会尽快更新我的回答。 - ULysses
您可以删除自己的帖子 - 在“编辑”和“标记”之间应该有一个“删除”链接。 - thecoop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接