2014-11-15 127 views
0

什么我真的不知道的是这个代码:这是一个引用类型的实例变量?

arrInt .....是一个整数数组和
listArr() ...是整数数组的动态列表

arrInt = {1, 2} 

listArr.add(arrInt) 

arrInt = {3, 4} 

listArr.add(arrInt) 

结果:
listArr(0)= {1,2}
listArr(1)= {3,4}

虽然我肯定的结果将是:
listArr(0)= {3,4}
listArr(1)= {3,4}

这将表明的每个元素listArr是强类型数组是实例化的副本arrInt
而不是arrInt也不一如即往参考arrInt, 因此值的参考,你可能会认为这是一个NA ive查询,〜>所有元素列表< T>创建为对象的副本?

+3

第三行创建一个新的数组对象。 –

+0

...以及第一个... –

+3

如果您询问代码,您应该发布编译的代码。 –

回答

4

是作为对象的副本创建的列表中的所有元素?

不,他们不是。你正在创建新的数组而不是修改同一个数组。

arrInt = {3, 4}是语法糖arrInt = new [] {3, 4}这是句法糖arrInt = new int[] {3, 4}。你现在可以看到新的数组分配吗?

要获得

listArr(0) = {3, 4} 
listArr(1) = {3, 4} 

你需要更改初始数组的内容:

arrInt = {1, 2}; 

listArr.add(arrInt); 

arrInt[0] = 3; 
arrInt[1] = 4; 

listArr.add(arrInt); 

这将导致INT两个listArr[0]listArr[1]相同的值。

+1

'{3,4}'并不总是''new [] {3,4}'的语法糖。 '{3,4}'是数组初始值设定项,它的数组类型是被声明的字段或变量的类型,而'new [] {3,4}'是数组创建表达式,数组类型紧接在初始化程序之前,或者从数组初始值设定项中的表达式推断出来。典型的例子:'object [] arrInt = {3,4}'(可以被编译)是完全不同的'object [] arrInt = new [] {3,4}'(无法编译) –

+0

@marcin是的。你在正确的轨道上。 thx –

0

如果没有长时间的对话,实际上无法确切知道这一系列陈述的哪一部分让您感到困惑。但在我看来,这些操作你得到错误的重要方面大概是这样的:执行该语句listArr.Add(arrInt);时,被添加到列表中的事情是arrInt被引用的对象的引用,而不是你似乎认为的变量arrInt本身。

一旦语句完成,在列表中的元素无论在什么方面的变量arrInt没有关系。该变量包含一个值,该值是对数组{ 1, 2 }的引用。当您执行listArr.Add(arrInt);时,添加到列表中的东西是该变量包含的,即对该数组的引用。

当您为变量arrInt指定一个新值时,即对完全不同的数组{ 3, 4 }的引用时,该变量本身将采用该新值。但是因为列表中的元素只是变量的前一个值,与变量本身无关,所以不受影响。

+0

换句话说,当语句“listArr.Add(arrInt)”被执行时,它们都以独立的方式指向相同的对象?如果对象发生变化,那么变化会反映在指向它的任何变量中? –

+0

对不起,我不确定他们在这里指的是什么。但是:如果任何_reference type_对象发生变化,那么当前引用该对象的任何变量将会随着它而改变。当然,变量本身并没有真正改变;只是语言表达对任何对象的访问方式是通过引用该对象的表达式,而当表达式只是一个变量时,它看起来就像是变化的变量。 –

相关问题