C# 如何自动更新对象引用

C# 如何自动更新对象引用,c#,.net,C#,.net,给定此示例代码: MyTable myTable = new MyTable(); MyTableClient1 foo= new MyTableClient1(myTable); MyTableClient2 bar= new MyTableClient2(myTable); MyTableClient3 baz= new MyTableClient3(myTable); ... and so on 您可以看到,我创建了MyTable的一个实例,并将其传递给内部存储它的其他对象,它们使用它,

给定此示例代码:

MyTable myTable = new MyTable();
MyTableClient1 foo= new MyTableClient1(myTable);
MyTableClient2 bar= new MyTableClient2(myTable);
MyTableClient3 baz= new MyTableClient3(myTable);
... and so on
您可以看到,我创建了MyTable的一个实例,并将其传递给内部存储它的其他对象,它们使用它,并且可能将其传递给其他对象

因此,对myTable的引用在我的运行时环境中的许多对象中传播

现在问题来了:我必须更新myTable,但我有一个方法可以为我提供一个新的更新myTable对象。检查以下各项:

myTable= MyTableProvider.getUpdated(myTable);
当然,这条语句是无用的,因为foo、bar等内部对myTable的所有引用仍然绑定到旧的myTable对象

我需要一种方法告诉c:“必须将对该对象的所有现有引用更新为另一个对象!”


有办法做到这一点吗?我认为无法手动替换foo、bar、baz等内部的对象。

方法1: 一种方法是使用包装器类:

class TableWrapper {
        public TableWrapper(MyTable table) {this.Table = table}
        public MyTable Table {get; set;}
}
那么您的代码将是:

MyTable myTable = new MyTable();
TableWrapper wrapped = new TableWrapper(myTable)
MyTableClient1 foo= new MyTableClient1(wrapped);
MyTableClient2 bar= new MyTableClient2(wrapped);

wrapped.Table= MyTableProvider.getUpdated(myTable);
这样,您的客户机将接收包装的对象并使用arg.Table而不仅仅是arg;然后修改wrapped的属性,现在更新客户机

方法2:下面的编辑:不起作用,因为参照不能存储为对象属性。不为存档目的而删除。 使用C#的“ref”关键字

修改MyTableClient的构造函数以接受ref MyTable,而不仅仅是MyTable。然后通过这样做把桌子递进来

MyTable myTable = new MyTable();
MyTableClient1 foo= new MyTableClient1(ref myTable);
MyTableClient2 bar= new MyTableClient2(ref myTable);

只要MyTableClient不复制数据而是使用原始引用,将myTable更改为更新的表将导致更改反映在表客户端中。

您可以使用full属性

    MyTableClient1 foo;
    MyTableClient2 bar;
    MyTableClient3 baz;

    private MyTable _myTable;
    public MyTable myTable
    {
        get { return _myTable; }
        set 
            { 
                foo = new MyTableClient1(value);
                bar = new MyTableClient2(value);
                baz = new MyTableClient3(value);

                _myTable = value;  
            }
    }

getUpdated
做什么?不是答案,但最好的办法是避免这种情况。。。您的TableClient概念或更新方法错误。或者两者都返回一个对新对象的引用不幸的是,这并不能解决必须更新多个
wrapped.Table
references的问题感谢Sebastian所做的更改。Camilo——由于C#通过引用而不是通过值传递对象,因此更新单个包装的表不会反映传递给客户端的所有表引用?这取决于MyTableProvider.GetUpdate是更新同一引用还是只创建新的objectSure;假设getUpdated返回对新对象的引用(我们将此引用称为U,它指向新的、更新的表)。旧表位于引用O处。wrapped被传递到表客户机中,每当需要与表交互时,表客户机就会访问wrapped.table。当wrapped.Table更改为从O指向U时,客户端对wrapped.Table的后续访问将产生对U的引用。我相信这实现了OP的预期效果。您应该为
栏添加一行,并显示包装器是否工作。