【问题标题】:What are the differences between value types and reference types in C#? [duplicate]C#中的值类型和引用类型有什么区别? [复制]
【发布时间】:2011-01-25 18:33:48
【问题描述】:

我知道一些区别,

  1. 值类型存储在堆栈中,而引用类型存储在托管堆中。
  2. 值类型变量直接包含它们的值,而引用变量仅包含对在托管堆上创建的对象位置的引用。

还有什么我错过的区别...如果有,它们是什么?

【问题讨论】:

标签: c# reference types


【解决方案1】:

请阅读:The stack is an implementation detail,并且不要再重复堆栈分配是 .NET 中值类型与引用类型的区别的谣言。 CLR 可以选择在任何它想要的地方分配一个变量。

最重要的区别在于赋值语义。当您将值类型分配给变量(或将其作为参数传递给方法)时,所有数据都会被复制。当您分配引用类型时,只会复制一个引用 - 两个引用都指向内存中的同一个对象实例。

【讨论】:

  • 措辞有点苛刻,但这是我学到的最好的方法,就像如果你惹恼了甘道夫并等待他用恼怒的声音向你解释,它往往会坚持 =D
【解决方案2】:

正如 Aaronaught 和 Eric 博文所述:

还记得规则,引用类型总是去堆,而值类型总是去它们被声明的地方吗?如果值类型在方法之外声明,但在引用类型内,它将被放置在堆上的引用类型中。

【讨论】:

    【解决方案3】:

    我认为值是隐式分配的内存,而不是引用类型,它们必须显式分配内存

    【讨论】:

      【解决方案4】:

      以下是一些额外的区别:

      1. 值类型不能被继承,而引用类型可以
      2. 值类型实现为结构,引用类型实现为类
      3. 默认情况下,不能为值类型分配真正的空值(? 语法是一种解决方法,但仍不会产生真正的空值)
      4. 将值类型分配给另一个变量,或将其作为方法中的参数传递,会对其进行复制,而对于引用类型,变量表示对象的内存位置
      5. 结构声明显式无参数构造函数是编译时错误,但同样不适用于类
      6. 在结构中分配所有字段之前使用“this”对象是编译时错误,但同样不适用于类
      7. 结构体没有完全分配其构造函数中的所有属性是编译时错误,但同样不适用于类

      【讨论】:

        猜你喜欢
        • 2011-06-30
        • 2017-05-22
        • 2010-12-11
        • 1970-01-01
        • 2012-02-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-02
        相关资源
        最近更新 更多