代码之家  ›  专栏  ›  技术社区  ›  JSBÕ±Õ¸Õ£Õ¹

在对象之间共享引用

  •  3
  • JSBÕ±Õ¸Õ£Õ¹  · 技术社区  · 14 年前

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

    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 这样: 裁判 仅用于方法参数。静电场不起作用,因为不起作用 全部的 SomeObject 实例应该引用同一个对象——相反,所讨论的对象应该在构造函数中设置。

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

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

    4 回复  |  直到 14 年前
        1
  •  4
  •   Andrew Bezzub    14 年前

    我不知道你能用什么类来做这个,但是我似乎很容易实现你自己的类 SharedReference<T> 班级。

    像这样:

    public sealed class SharedReference<T>
        where T : class
    {
        public T Reference
        {
            get; set;
        }
    }
    
        2
  •  1
  •   thecoop    14 年前

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

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

    除此之外,我认为您需要定义自己的“持有者”类别并使用它

        3
  •  1
  •   Adam Houldsworth    14 年前

    如果只提供对象的引用而不提供 ref 关键词,你会得到你想要的行为。使用 裁判 实际上是传递对引用的引用(指向指针的指针),所以除非您希望 null 别人的推荐信,对你没有任何用处。

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

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

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

        4
  •  0
  •   ULysses    14 年前

    在C,

    
    class SomeObject
    {
        private DataObject _data;
        public SomeObject(DataObject data)
        {
             _data = data;
        }
    }
    

    事实上,如果dataobject是引用类型,那么它会完全满足您的需要,这对于所有类都是正确的。

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