我对c#中的具体案例感到好奇:
在此代码中,pointToSourceArr
指向源arr,但如果我通过将sourceArr
设置为新数组或将其设置为null来更改pointToSourceArr
,则{ "Itamar", "sasha" }
仍然保留其两个对象:
string[] sourceArr = new string[] { "Itamar", "sasha" };
string[] pointToSourceArr = sourceArr;
sourceArr = new string[]() // OR NULL;
。那是为什么?
{{1}}
答案 0 :(得分:2)
为什么?
每个变量的值只是对数组的引用。这里的任务:
string[] pointToSourceArr = sourceArr;
只是将sourceArr
的现有值复制到pointToSourceArr
。它并没有在两个变量之间建立长期的关系。
想象一下,我写了一张纸,上面写着我的家庭住址......然后我将那张纸复印给你。如果我然后在我的纸上划掉地址,那不会改变你的那张纸,是吗?它在这里完全一样。
请注意,如果您改变了数组中的某些数据,例如
sourceArr[0] = "Foo";
那么这相当于我去我家并将前门涂成红色 - 在这种情况下如果你去了你纸上的地址,你会看到一个红色前门。它是改变变量值(没有其他变量被改变)和改变对象内的值之间的区别(这意味着可以看到该对象可以观察到变化的任何东西)。
答案 1 :(得分:2)
因为pointToSourceArr
没有指向变量sourceArr
,它也是一个“指针”(实际上是引用),但是直接指向您创建的此对象new string[] { "Itamar", "sasha" };
。当您更改sourceArr
变量指向的位置时,它不会影响pointToSourceArr
指向的位置。
下图显示了为sourceArr
变量赋值null之前和之后的状态。
答案 2 :(得分:0)
这是因为当您的代码执行时,它按顺序执行。因此,当您初始化sourceArr
时,有两个值{"Itamar",sasha}
。由于您的代码按顺序执行,因此当您初始化pointToSourceArr
并将其设置为与sourceArr
相同时,它基本上变为sourceArr
的另一个版本,但仍具有与{{1}相同的值} 在此刻。现在,一旦你更改了sourceArr
的值,因为你的代码已经执行了前两行,souceArr
仍然会与原来的相同,所有改变的是它的值pointToSourceArr
更清楚地解释这一点,我的名字是卢克,想象我是以父亲的名字命名的,他也被称为卢克。在代码方面如果公平地说sourceArr.
,现在想象我的父亲改变了他的名字,我的名字仍然是卢克,但他的名字将是别的。
最后,如果您希望pointToSourceArr再次与SouceArr相同,则需要在myName = fathersName
的值发生更改后再次写入pointToSourceArr = sourceArr;
。
希望有所帮助。