2017-09-16 207 views
0

我试图从其他类中更改对象值。理想情况下,我想将对象作为参数传递给构造函数/方法。到目前为止,我读过的东西,当作为参数传递时,对象的行为与引用相同,参数值在本地复制以用于方法的主体。所以这里是我测试的几个配置:C#通过另一个类更改对象值

案例#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年底还空着,而Processor表中弥漫。

案例#2。失败

public Processor(ref DataTable table) 
{ 
    this.table = table; 
} 

我使用ref签名试过,但结果还是一样(mainTable是空的)。

案例#3。失败

public void InitializeTable(DataTable table) 
{ 
    // Fill data into table 
} 

我已经去除了构造函数和饲料mainTableInitializeTable()方法和结果还是一样(mainTable是空的)。

案例#4。作品!

public void InitializeTable(ref DataTable table) 
{ 
    // Fill data into table 
} 

最后这个工程!将ref mainTable送入InitializeTable现在成功填写mainTable。这背后有什么解释?为什么构造函数没有与mainTable相同的引用?当传递对象作为参数时,为什么ref关键字仍然需要传递它的引用?

+0

'InitializeTable()'实际上做了什么?在第一个完整的例子中,我肯定希望'mainTable'反映所做的任何修改,因为在内存中只有一个实际的'DataTable'实例化了。 – David

+0

简单的查询从数据库中获取数据,并将其分配给表。是的,我也有相同的假设,但只有case#4填充mainTable。 – Suwandy

+0

“你把它分配给表”是什么意思?如果代码没有达到你期望的程度,不要模糊地描述代码,并假定它必须工作,实际上检查它。 – David

回答

0

幸得大卫:

然后解释的行为。您正在将本地表 变量重新分配给新的DataTable实例(由.SelectArray()返回)。因此 它不再引用与mainTable变量相同的实例,并且 不再修改该实例。

+0

所以你的意思是'只读数据表';'。推荐的。 –

相关问题