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