C# 列表<;T>;-我是否传递对象或引用?

C# 列表<;T>;-我是否传递对象或引用?,c#,list,generics,C#,List,Generics,我研究过泛型,有以下问题: List<someClass> list=new List<someClass> SomeClass MyInstance=SomeClass(); list.Add(MyInstance); List List=新列表 SomeClass MyInstance=SomeClass(); list.Add(MyInstance); 我不确定将向列表中添加什么-引用或引用类型的对象(指向MyInstance的实际值)。 编辑:或者我将添加

我研究过泛型,有以下问题:

List<someClass> list=new List<someClass>

SomeClass MyInstance=SomeClass();

list.Add(MyInstance);
List List=新列表
SomeClass MyInstance=SomeClass();
list.Add(MyInstance);
我不确定将向列表中添加什么-引用或引用类型的对象(指向MyInstance的实际值)。
编辑:或者我将添加指向实际对象的值(即引用数据类型)


谢谢

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

因为
someClass
是引用类型,对
MyInstance
的引用将被复制到列表中。

假设someClass是引用类型(例如class),而不是值类型(例如struct),那么它就是引用

我也承认,用someClass来定义一个结构是非常危险的

struct someClass


这里是Jon Skeet关于参数传递的文章的结尾

将添加引用,因为
MyInstance
属于引用类型

列表将存储对象的引用,而不是对象实例


实际上,列表按使用数组存储值,数组将引用存储在堆栈上,并将对象实例存储在堆上。

如果按如下方式处理对象

MyInstance = null
然后,您无法读取MyInstance对象

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

因为有两个引用指向MyInstance

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

一是

SomeClass MyInstance=SomeClass();
另一个存储在列表中

你只要处理其中一个


因此,您仍然可以阅读列表[0]

类始终作为references@Skliwz:“类总是作为引用传递”首先,类不会传递到任何地方。有一些对象,出于我们的目的(这意味着我隐藏了一些细节),它们要么是值类型的实例,要么是引用类型的实例。其次,除非参数标记为
ref
out
,否则它将按值传递。我重复一下:除非标记为
ref
out
,否则所有参数都是按值传递的,无论参数是值类型的实例还是引用类型的实例。对于引用类型,该值是reference.angren:实际上,引用类型的值将添加到列表中。这个值指向堆上的对象,我在这里说:“引用的副本实际上”问题是列表中是否有引用或值,答案是引用,正如已经回答的那样。将变量设置为
null
不是“正在处理”。不正确。引用存储在堆上。对
列表
本身的引用可能在堆栈上,但它包含的引用不在堆栈上。