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;
}