我有以下代码:
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
由于:
有人告诉我为什么结果 12 ?
答案 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)
这是因为NewType
是struct
,它作为值类型添加到列表中(对象的副本添加到列表中,而不是对原始对象的引用)。
如果您将其从struct
更改为class
,则会如您所愿。该类通过引用传递。
查看Classes and Structs (C# Programming Guide)
结构是一种值类型。创建结构时,变量为 结构所分配的是结构的实际数据。当。。。的时候 struct被赋值给一个新变量,它被复制。新变量 因此原始变量包含两个单独的副本 相同的数据。对一个副本所做的更改不会影响另一个副本。
答案 2 :(得分:1)
因为NewType
是struct
而结构是值类型,但不是类之类的引用类型。如果您使用class
代替结构,则会获得22
,此post将帮助您理解。
答案 3 :(得分:0)
基本数据类型与抽象数据类型不同。 int不是引用,因此与非基本数据类型不同,实际上是复制的。
答案 4 :(得分:0)
IList.Add(i)
隐含地执行i
的浅表副本,因为NewType
是值类型(结构)。在执行浅拷贝时,它还按值复制字段NewType.val
。因此IList
包含两个不同的NewType
值,这些值本身包含不同的val
整数。
如果您将NewType
从struct
更改为class
,那么您将获得所期望的内容。