List<T> - 我需要传递对象还是引用?

15

嗯,我已经研究了泛型并有以下问题:

List<someClass> list=new List<someClass>

SomeClass MyInstance=SomeClass();

list.Add(MyInstance);

我不确定将添加到列表中的是引用还是指向MyInstance实际值的引用类型对象。
编辑:或者我将添加一个值(即引用数据类型),该值指向实际对象?

谢谢


2
类始终作为引用传递。 - Sklivvz
3
首先,类并没有被传递到任何地方。我们有对象,而对于我们的目的(这意味着我隐瞒了一些细节),它们要么是值类型实例,要么是引用类型实例。其次,除非参数带有refout标记,否则它是按值传递的。我会重复一遍:所有参数,除非带有refout标记,否则都是按值传递的,无论该参数是值类型实例还是引用类型实例。对于引用类型,值就是引用。 - jason
6个回答

20

当你处理引用类型时,你总是在处理引用,因此一个引用将被添加到列表中(实际上是引用的副本)。你实际上没有选择;这就是语言的工作方式。


angren:实际上,引用类型的值将被添加到列表中。这个值指向堆上的对象。 - Lojol
是的,我在这里确实说过:“实际上是引用的副本”。 - Ed S.

6
假设someClass是一个引用类型(例如类),而不是值类型(例如结构体),那么它就是一个引用。
此外,我承认定义一个名为someClass的结构体会非常麻烦。
这里有一篇关于参数传递的Jon Skeet文章的必要链接

4

由于 someClass 是一个引用类型,所以会将对 MyInstance 的引用复制到列表中。


1

由于MyInstance是引用类型,因此将添加一个引用。


-1
如果你像下面这样处理你的对象
MyInstance = null

那么,你无法读取MyInstance对象,

但你仍然可以读取列表中的对象,

因为你有两个引用指向MyInstance,

换句话说,该对象有两个引用,

其中一个是

SomeClass MyInstance=SomeClass();

另一个被存储在列表中,

你只需要处理其中一个,

所以你仍然可以读取list[0]


问题是列表中是否有引用或值,答案是引用,已经回答了。 - Pål GD
将变量设置为 null 不是“处理”操作。 - Andrew Barber

-1

该列表将存储对象的引用而非对象实例。

实际上,List通过使用数组来存储值,数组将引用存储在堆栈上并将对象实例存储在堆上。


不正确。引用存储在堆上。对于 List<> 的引用本身可能在栈上,但它所包含的引用不是。 - Andrew Barber

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接