关于object = new,当另一个引用类型指向它时

时间:2014-11-23 08:45:41

标签: c# object reference-type

我对c#中的具体案例感到好奇: 在此代码中,pointToSourceArr指向源arr,但如果我通过将sourceArr设置为新数组或将其设置为null来更改pointToSourceArr,则{ "Itamar", "sasha" }仍然保留其两个对象: string[] sourceArr = new string[] { "Itamar", "sasha" }; string[] pointToSourceArr = sourceArr; sourceArr = new string[]() // OR NULL; 。那是为什么?

{{1}}

3 个答案:

答案 0 :(得分:2)

  

为什么?

每个变量的值只是对数组的引用。这里的任务:

string[] pointToSourceArr = sourceArr;

只是sourceArr的现有值复制到pointToSourceArr。它并没有在两个变量之间建立长期的关系。

想象一下,我写了一张纸,上面写着我的家庭住址......然后我将那张纸复印给你。如果我然后在我的纸上划掉地址,那不会改变你的那张纸,是吗?它在这里完全一样。

请注意,如果您改变了数组中的某些数据,例如

sourceArr[0] = "Foo";
那么这相当于我去我家并将前门涂成红色 - 在这种情况下如果你去了你纸上的地址,你看到一个红色前门。它是改变变量值(没有其他变量被改变)和改变对象内的值之间的区别(这意味着可以看到该对象可以观察到变化的任何东西)。

答案 1 :(得分:2)

因为pointToSourceArr没有指向变量sourceArr,它也是一个“指针”(实际上是引用),但是直接指向您创建的此对象new string[] { "Itamar", "sasha" };。当您更改sourceArr变量指向的位置时,它不会影响pointToSourceArr指向的位置。

下图显示了为sourceArr变量赋值null之前和之后的状态。

enter image description here

答案 2 :(得分:0)

这是因为当您的代码执行时,它按顺序执行。因此,当您初始化sourceArr时,有两个值{"Itamar",sasha}。由于您的代码按顺序执行,因此当您初始化pointToSourceArr并将其设置为与sourceArr相同时,它基本上变为sourceArr的另一个版本,但仍具有与{{1}相同的值} 在此刻。现在,一旦你更改了sourceArr的值,因为你的代码已经执行了前两行,souceArr仍然会与原来的相同,所有改变的是它的值pointToSourceArr

更清楚地解释这一点,我的名字是卢克,想象我是以父亲的名字命名的,他也被称为卢克。在代码方面如果公平地说sourceArr.,现在想象我的父亲改变了他的名字,我的名字仍然是卢克,但他的名字将是别的。

最后,如果您希望pointToSourceArr再次与SouceArr相同,则需要在myName = fathersName的值发生更改后再次写入pointToSourceArr = sourceArr;

希望有所帮助。