2010-07-19 36 views
3

在C#中,以下“容器”保存引用类型的引用或对象本身?队列保持引用或对象值?

Queue 
Stack 
Array 
List 
Vector 

例如,如果我执行以下操作:

Queue<MyItem> item = new Queue<MyItem>(100); 
MyItem mit = new MyItem(); 
item.Enqueue(mit); 

mit的参考被复制到itemmit对象本身已被移动到item存储器的地址?

如果我说

item = null; 

它不会设置所有对象中item为null。我对吗?

回答

5

该队列包含对包含项目的引用。将队列设置为null不会影响项目本身。

+0

其他容器是一样的吗? – 5YrsLaterDBA 2010-07-19 17:46:15

+0

@ 5YrsLaterDBA是,只要项目是引用类型 – msarchet 2010-07-19 17:51:43

+0

即使对于基元(值类型)?如果我实例化: '队列 item =新队列(100);' 它会自动向对象引用int并使用引用或存储值吗?这将是一个真正的低谷,花费更多的内存比它应该:( – DanteTheSmith 2017-04-18 07:29:31

2

这取决于MyItem是否为值类型(有时在关键字后称为struct)或引用类型(class)。值类型分配复制值(即整个对象),而引用类型复制引用。

0

将mit的引用复制到item或mit对象本身已被移动到item存储位置?

所有的
  • 首先,我觉得你关心太多的关于implementaion细节。

  • “mit的参考”有点意义。 “mit”是一个参考。如果我添加mit2 = mit;,则mit2引用同一个对象。

  • 同样,将“mit对象本身...移动到项目内存位置”在托管代码中并不真正有意义。如果我添加item.Enqueue(mit2);,则项目现在有两个指向同一对象的条目。

+0

为什么你认为'mit'是一个参考?它可以是一个结构是价值型的。在这种情况下,它被复制到队列中。 – 2017-03-21 22:53:18

+0

@kami问题的最后一行假定存储在Queue中的东西可以设置为null,因此它必须是引用类型。 – 2017-03-22 23:52:49

0

麻省理工学院的基准复制到 项目或对象MIT本身已经 移动到项目的存储位置?

不是。如果所讨论的对象是引用类型,那么它既不被移动也不被复制。更确切地说,对该集合添加了对同一对象的新引用。如果对象是一个值类型,那么它确实被复制。

如果我说item = null;它不会 将项目内的所有对象设置为null。 我对不对?

你是对的。它不会对集合中包含的项目做任何事情,无论它们是参考还是值类型。