C# 两个阵列';s元素对对象的引用
我有以下代码:C# 两个阵列';s元素对对象的引用,c#,reference,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); } struct
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);
}
struct NewType
{
公共国际价值;
}
静态void Main(字符串[]参数)
{
新类型i=新的新类型();
List IList=新列表();
i、 val=1;
IList.添加(i);
i、 val=2;
IList.添加(i);
}
之后,如果我打印IList列表中的每个元素,结果将是12
这和我想的正好相反
因为:
有人告诉我为什么结果是12?基本数据类型的工作方式不同于抽象数据类型。int不是引用,因此实际上是复制的,不像非基本数据类型。基本数据类型的工作方式不同于抽象数据类型。整数不是引用,因此与非基本数据类型不同,它实际上是复制的。类型
NewType
是值类型,而不是引用类型。这意味着IList
,其类型为List
,保存的是未引用的值的副本。话虽如此,你的照片是不正确的
之后,如果我打印IList列表中的每个元素,结果将是
12岁这和我想的正好相反
这是预期的结果
这里
在IList
中添加i值的副本。该副本的val值为1
然后
您可以通过复制值2来更改val
的值。在此之后,将i
的副本添加到IList
。此副本的val值为2
为了让您注意到您在问题中的描述,类型NewType
应该是引用类型。如果将NewType
的定义更改为以下定义:
class NewType
{
public int val;
}
您会注意到您所描述的类型。类型
NewType
是值类型,而不是引用类型。这意味着IList
,其类型为List
,保存的是未引用的值的副本。话虽如此,你的照片是不正确的
之后,如果我打印IList列表中的每个元素,结果将是
12岁这和我想的正好相反
这是预期的结果
这里
在IList
中添加i值的副本。该副本的val值为1
然后
您可以通过复制值2来更改val
的值。在此之后,将i
的副本添加到IList
。此副本的val值为2
为了让您注意到您在问题中的描述,类型NewType
应该是引用类型。如果将NewType
的定义更改为以下定义:
class NewType
{
public int val;
}
您会注意到您所描述的thta。因为
NewType
是一个struct
,struct是一个值类型,但不像类那样是引用类型。如果您使用的是class
而不是struct,您将得到22
,这将有助于您理解。因为NewType
是一个struct
,struct是一个值类型,但不像类那样是引用类型。如果您使用的是class
而不是struct,您将得到22
,这将帮助您理解。这是因为NewType
是一个struct
,它作为值类型添加到列表中(对象的副本添加到列表中,而不是原始对象的引用)
如果您将它从struct
更改为class
,那么它将如您所期望的那样。该类是通过引用传递的
看看
结构是一种值类型。创建结构时,变量
分配给结构的对象保存结构的实际数据。当
结构被分配给一个新变量,它被复制。新变量
因此,原始变量包含
同样的数据。对一个副本所做的更改不会影响另一个副本
这是因为
NewType
是一个struct
,作为值类型添加到列表中(对象的副本添加到列表中,而不是原始对象的引用)
如果您将它从struct
更改为class
,那么它将如您所期望的那样。该类是通过引用传递的
看看
结构是一种值类型。创建结构时,变量
分配给结构的对象保存结构的实际数据。当
结构被分配给一个新变量,它被复制。新变量
因此,原始变量包含
同样的数据。对一个副本所做的更改不会影响另一个副本
IList.Add(i)
隐式执行i
的浅层副本,因为NewType
是一种值类型(结构)。在执行浅复制时,它还会按值复制字段NewType.val
。因此IList
包含两个不同的NewType
值,它们本身包含一个不同的val
整数
如果您将NewType
从struct
更改为class
,那么您将得到您所期望的。IList.Add(i)
隐式执行i
的浅层副本,因为NewType
是一种值类型(结构)。在执行浅复制时,它还会按值复制字段NewType.val
。因此IList
包含两个不同的NewType
值,它们本身包含一个不同的val
整数
如果您将NewType
从struct
更改为class
,则您将获得所需的内容
class NewType
{
public int val;
}