C#=意思是2个不同的东西

时间:2013-10-09 19:01:34

标签: c#

我怀疑这背后有一些非常根本的东西,我完全没有注意到。我可以写

int b = 5;
int a = b;
a = 2; 

从我能说的最好,这给了我两个独立的变量。最初,a设置为5,但是我可以将a更改为2 而不更改b

然而,我可以写

double[] b = { 1, 2, 3, 4};
double[] a = b; 
a[2] = 9; 

现在看来,我没有2个独立的变量,而是对同一个实体有2个引用。现在改变a [2]会改变b [2]。这是怎么回事?

5 个答案:

答案 0 :(得分:6)

C#中有两种类型的变量。第一种称为“价值”类型。为其分配值时,该值将复制到该位置,因此在您编写

int b = a;

您正在的值复制为b。

但是,还有一个“参考”类型。这只会将引用复制到变量中 - 换句话说,它会获得变量的一种处理方式,这样当对该变量进行更改时,它们就会反映在两个地方。

值类型包括struct和所有基元 - 整数,双精度,字符等字符串。参考类型是其他所有内容。

有些评论者已经提供了很好的链接,所以我不会在这里添加任何内容。

答案 1 :(得分:2)

在C#中,数组是参考类型。见this

虽然我认为这最终会成为一个重复的问题,但我很抱歉没有在链接上进一步阐述。

在C#中,您有值类型和引用类型。所有数组(即使它们是值类型的数组)都是引用类型。

值类型的行为与第一个示例相同,存储其值所需的内存在Stack上分配,该堆栈与包含对象的范围一起生存和死亡。

引用类型只存储一个指向Heap上分配内存的位置的指针,它一直存在,直到垃圾收集器确定不再使用它并且可以清除它。因此,如果将引用类型分配给另一个引用类型,则它们是具有不同名称的同一对象。

这当然是极其过分简化的,但您可以在我的答案或任何针对同一主题的精彩SO问题的链接中获取更多信息。

答案 2 :(得分:2)

.NET中有两种类型,值类型和引用类型。 Int是值类型,double []是一个数组,它是一个引用类型。

您的第一个a = b将{b(仅保留值5)分配给a。在第二个示例中,b包含对内存中数组的引用,而a = b只是将a指向同一个数组。

答案 3 :(得分:1)

在第一个示例中,int是一个值类型,每个都被赋予一个内存位置。 在第二个示例中,数组是复杂数据类型或引用类型,因此将其分配为指针。

答案 4 :(得分:1)

标准数组行为。

如果您使用简单的=运算符,则会传递引用,然后您可以操作原始对象。

要防止此行为,请使用内置函数.CopyTo()Array.Clone()

a.CopyTo(b, 0)
b = a.Clone();

当您现在更改b时,a。将无法更改。

<强>注意:

只有在确保b可以包含a的所有元素(b.Length&gt; = a.Length)之后才使用此函数,否则将抛出超出范围异常的索引