我想让多个对象通过私有字段共享引用,这样任何对象都可以分配给该字段,并且共享该引用的其他对象将看到更新的字段。我原本希望做的是:
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
的值。
答案 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是一个引用类型,实际上完全符合你的要求,对所有类都适用。
由于我误解了最初的问题,请忽略这个答案。
其他答案完全涵盖了这个主题。