【问题标题】:List<T> - do I pass objects or references?List<T> - 我是否传递对象或引用?
【发布时间】:2011-01-19 21:45:48
【问题描述】:

好吧,我研究了泛型并有以下问题:

List<someClass> list=new List<someClass>

SomeClass MyInstance=SomeClass();

list.Add(MyInstance);

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

谢谢

【问题讨论】:

  • 类总是作为引用传递
  • @Skliwz:“类总是作为引用传递” 首先,类不会在任何地方传递。有对象,出于我们的目的(这意味着我隐藏了一些细节),它们要么是值类型的实例,要么是引用类型的实例。其次,除非参数标有refout,否则它是按值传递的。我再重复一遍:所有参数,除非标有refout,都是按值传递的,无论参数是值类型的实例还是引用类型的实例。对于引用类型,值就是引用。

标签: c# list generics


【解决方案1】:

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

【讨论】:

  • angren:实际上引用类型的值也会添加到列表中。这个值指向堆上的对象
  • 是的,我在这里说过:“实际上是参考的副本”
【解决方案2】:

假设 someClass 是引用类型(例如类)而不是值类型(例如结构),那么它就是一个引用。

我也承认定义一个名为 someClass 的结构是非常糟糕的

struct someClass

这是关于参数传递的 Jon Skeet 文章的obligatory link

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      将添加一个引用,因为MyInstance 是引用类型

      【讨论】:

        【解决方案5】:

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

        其实List是通过数组来存储值的,而数组在栈上存储引用,在堆上存储对象实例。

        【讨论】:

        • 不正确。引用存储在堆上。对List&lt;&gt; 本身的引用可能在堆栈上,但它包含的引用不在。
        【解决方案6】:

        如果你像下面这样处理你的对象

        MyInstance = null
        

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

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

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

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

        一个是

        SomeClass MyInstance=SomeClass();
        

        另一个存储在列表中,

        你只需处理其中一个,

        所以你仍然可以阅读列表[0]

        【讨论】:

        • 问题是列表中是否有引用或值,答案是reference,正如已经回答的那样。
        • 将变量设置为null不是“处置”。
        猜你喜欢
        • 2012-07-08
        • 1970-01-01
        • 1970-01-01
        • 2014-02-08
        • 1970-01-01
        • 2016-01-30
        • 2015-03-06
        • 2013-11-11
        • 2012-10-31
        相关资源
        最近更新 更多