C# 在对象之间共享引用
我想让多个对象通过一个私有字段共享一个引用,这样任何对象都可以指定给该字段,更新后的字段将被共享该引用的其他对象看到。我最初希望做的是:C# 在对象之间共享引用,c#,reference,C#,Reference,我想让多个对象通过一个私有字段共享一个引用,这样任何对象都可以指定给该字段,更新后的字段将被共享该引用的其他对象看到。我最初希望做的是: class SomeObject { private ref DataObject _data; public SomeObject(ref DataObject data) { _data = ref data; // or something similar } public ChangeData
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
类可供我使用
更新,因为大多数答案都误解了我的问题。我知道\u data
字段包含对原始数据对象的引用。我想要的是另一个间接层次。我希望能够在一个实例中更改指向的对象,并让使用相同引用创建的其他实例拾取新值。正如更新后的代码示例所示,我希望分配给\u data
,并在其他情况下有效地更改\u data
的值。如果只提供对对象的引用而不使用ref
关键字,您将获得所需的行为。使用ref
实际上是传递对引用的引用(指向指针的指针),因此除非您希望null
其他人的引用,否则它对您没有任何用处
更新:很抱歉,我没有发现您想要将一个全新的对象重新分配到字段中,并在整个字段中反映出来。实际上,您最好创建一个包装类来包含对象状态并对其进行修改,或者创建一个所有实例都可以订阅的公共事件,以便在您想要更改对象时,使用其中的新对象触发事件,并让每个实例更新其自己的内部引用
或者,使用Singleton模式—每个人都访问一个公开的静态引用,但与传统的Singleton不同,如果他们愿意,您可以让他们更改引用—这样每个人都可以看到更改。这还有一个好处,即对象不需要内部引用
或者,让数据类公开一个方法,允许它使用另一个数据类,并像克隆一样复制其状态。在C#中
类对象
{
私有数据对象_数据;
公共对象(数据对象数据)
{
_数据=数据;
}
}
事实上,如果DataObject是引用类型,那么它就完全符合您的要求,这对于所有类都是正确的
请忽略此答案,因为我误解了最初的问题。
此处的其他答案完全涵盖了此主题。您只需使用共享对象数组,然后重新分配数组元素:
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”类并使用它,我不知道您可以使用哪个类来实现它,但是我似乎很容易实现您自己的SharedReference
类
大概是这样的:
public sealed class SharedReference<T>
where T : class
{
public T Reference
{
get; set;
}
}
公共密封类共享引用
T:在哪里上课
{
公众咨询
{
获得;设置;
}
}
否-他想重新分配字段completelyNope-他想重新分配字段completely@thecoop请取消反对票。这个问题在我发帖后更新了,最初的问题模棱两可。我将简短地更新我的答案你可以删除你自己的帖子-在“编辑”和“标记”之间应该有一个“删除”链接。你如何定义哪些对象共享引用,哪些对象有自己的实例?这是第一个真正理解这个问题的答案。谢谢:)@JS-Bangs我没有发现作业部分-我立即读到“更改状态”lol,我修改了我的答案。在IMO中使用数组不是一个很好的方法,它的可读性不如其他方法。我可以使用这个。为了更加方便,我刚刚添加了一个隐式操作符T
。
public sealed class SharedReference<T>
where T : class
{
public T Reference
{
get; set;
}
}