前几日与同事讨论一个相对复杂的场景,需要先将中间过程存储在List中,稍后再用。同时程序类的许多线程共用了一个全局变量。
具体来说就是如下代码
。。。
_order = order1;
_list.Add(_order);
。。。
_order = order2;
_list.Add(_order);
。。。
_order = order3;
_list.Add(_order);
。。。
_list.ForEach(o => PrintContent(o));
。。。
对于打印内容,到底是1、2、3不同内容呢,还是都是3的内容?大家意见不一。运行一下看看结果,当然是最简单的事情,这也不是最重要的。重要的是,玩儿C#这么多年,对于这么个简单的问题,我们都有自己的见解。
一边认为,既然都是将_order添加进去,而_order又在不断变化,最后肯定是都是一样的内容。另一边认为,记录的应该是内存的实际指向,除非记录的位置明确被更改,否则不应该变化,不会随之中间变量的变化而变化。事实证明,后者是正确的。
发散一下,如果是结构体(虽然现在已经用的很少了)的话,情况又有不同。。。如果在list添加进去一个结构体,然后对传入的中间变量进行更改,并不会反映的list对应的项上。
其实回头想想,这不就是我们初学面向对象语言时经常遇到的,对于一个函数形参的指针传递与值传递问题吗?