给出这个示例代码:
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);
对于cource来说这个语句没用,因为foo,bar等内部对myTable的所有引用仍然与旧的MyTable对象绑定...
我需要一种方法告诉c#:“所有对此对象的现有引用都必须更新到另一个对象!”
有办法做到这一点吗?我无法想到手动替换foo,bar,baz等中的对象。
答案 0 :(得分:1)
方法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:编辑:以下不起作用,因为refs无法存储为对象属性。不删除以进行存档。 使用C#"参考"关键字。
修改MyTableClient的构造函数以接受ref MyTable而不仅仅是MyTable。然后通过执行
传递表MyTable myTable = new MyTable();
MyTableClient1 foo= new MyTableClient1(ref myTable);
MyTableClient2 bar= new MyTableClient2(ref myTable);
只要MyTableClient不复制数据但使用原始引用,将myTable更改为更新的表将导致更改反映在表客户端中。
答案 1 :(得分:0)
您可以使用完整的属性。
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;
}
}