我正在尝试从其他类更改对象值。理想情况下,我想将对象作为参数传递给构造函数/方法。到目前为止我读过的内容,对象在作为参数传递时表现为引用,并且参数值在本地复制以在方法体中使用。所以我测试的配置很少:
案例#1。失败
class Processor
{
DataTable table;
public Processor(DataTable table)
{
this.table = table;
}
public void InitializeTable()
{
if (table != null)
{
// Fill data into DataTable.
}
}
}
static void Main(string[] args)
{
DataTable mainTable = new DataTable();
Processor processor = new Processor(mainTable);
processor.InitializeTable();
// mainTable still empty
}
我认为Processor
表与mainTable
保持相同的引用,但是Main
执行mainTable
的结尾仍然是EMPTY而Processor
表已填充
案例#2。失败
public Processor(ref DataTable table)
{
this.table = table;
}
我已尝试使用ref
签名,但结果仍然相同(mainTable
为EMPTY)。
案例#3。失败
public void InitializeTable(DataTable table)
{
// Fill data into table
}
我删除了构造函数并将mainTable
提供给InitializeTable()
方法,结果仍然相同(mainTable
为EMPTY)。
案例#4。作品!
public void InitializeTable(ref DataTable table)
{
// Fill data into table
}
最后这个有效!将ref mainTable
提供到InitializeTable
现在可以成功填写mainTable
。这有什么解释?为什么构造函数对mainTable
没有相同的引用?为什么在将对象作为参数传递时仍需要ref
关键字已经意味着传递其引用?
答案 0 :(得分:1)
归功于大卫:
然后,这解释了行为。您正在重新分配本地表 变量到新的DataTable实例(由.SelectArray()返回)。所以 它不再引用与mainTable变量相同的实例 不再修改该实例。