C#通过另一个类更改对象值

时间:2017-09-16 13:21:26

标签: c# pass-by-reference

我正在尝试从其他类更改对象值。理想情况下,我想将对象作为参数传递给构造函数/方法。到目前为止我读过的内容,对象在作为参数传递时表现为引用,并且参数值在本地复制以在方法体中使用。所以我测试的配置很少:

案例#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关键字已经意味着传递其引用?

1 个答案:

答案 0 :(得分:1)

归功于大卫:

  

然后,这解释了行为。您正在重新分配本地表   变量到新的DataTable实例(由.SelectArray()返回)。所以   它不再引用与mainTable变量相同的实例   不再修改该实例。