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
不是“正在处理”。不正确。引用存储在堆上。对列表
本身的引用可能在堆栈上,但它包含的引用不在堆栈上。