两个数组对象的元素引用

时间:2015-04-17 07:33:26

标签: c# reference

我有以下代码:

struct NewType
{
    public int val;
}

static void Main(string[] args)
{
    NewType i = new NewType();
    List<NewType> IList = new List<NewType>();

    i.val = 1;
    IList.Add(i);

    i.val = 2;
    IList.Add(i);
}

之后,如果我在IList列表中打印每个元素,结果将是 12 它与我的想法相反 22

由于: enter image description here

有人告诉我为什么结果 12

5 个答案:

答案 0 :(得分:2)

类型NewType是值类型,而不是引用类型。这意味着IList,其类型为List<NewType>,保存值的副本,而不是对它们的引用。话虽这么说,你的照片不正确。

  

之后,如果我打印IList列表中的每个元素,结果将是   是12它与我的想法相反22

这是预期的。

这里

i.val = 1;
IList.Add(i);

您在IList中添加了i值的副本。该副本的val值为1。

然后

i.val = 2;
IList.Add(i);

您可以通过复制val的值来更改i的值。之后,您将IList的副本添加到NewType。该副本的val值为2。

为了注意到您在问题中描述的内容,NewType类型应该是引用类型。如果您将class NewType { public int val; } 的定义更改为以下内容:

{{1}}
你会注意到你已经描述过了。

答案 1 :(得分:2)

这是因为NewTypestruct,它作为值类型添加到列表中(对象的副本添加到列表中,而不是对原始对象的引用)。

如果您将其从struct更改为class,则会如您所愿。该类通过引用传递。

查看Classes and Structs (C# Programming Guide)

  

结构是一种值类型。创建结构时,变量为   结构所分配的是结构的实际数据。当。。。的时候   struct被赋值给一个新变量,它被复制。新变量   因此原始变量包含两个单独的副本   相同的数据。对一个副本所做的更改不会影响另一个副本。

答案 2 :(得分:1)

因为NewTypestruct结构是值类型,但不是类之类的引用类型。如果您使用class代替结构,则会获得22,此post将帮助您理解。

答案 3 :(得分:0)

基本数据类型与抽象数据类型不同。 int不是引用,因此与非基本数据类型不同,实际上是复制的。

答案 4 :(得分:0)

IList.Add(i)隐含地执行i的浅表副本,因为NewType是值类型(结构)。在执行浅拷贝时,它还按值复制字段NewType.val。因此IList包含两个不同的NewType值,这些值本身包含不同的val整数。

如果您将NewTypestruct更改为class,那么您将获得所期望的内容。