【问题标题】:Reference type inside Value type in .NET.NET 中值类型内的引用类型
【发布时间】:2017-01-11 19:32:18
【问题描述】:

结构是 C# 中的值类型,字符串是引用类型。我知道它们的内存分配和映射的区别,但我不确定 C# 引用类型是如何存储在值类型中的。假设我在以下结构中有一个字符串。 如果结构内部的引用类型是在堆上创建的,那么当结构作为参数传递给函数时,编译器如何管理堆上的数据。

字符串会创建在栈上还是堆上?

如果我将 Struct Point 的对象传递给函数,.net 如何在 Struct 中管理 PointC 的对象。如果 PointC 是在堆上创建的,那么将 stuct 传递给函数将具有与类相同的内存?

   public class PointC
    {
      ...
      ...
    }
   public struct Point
    {
      PointC obj;
    }

【问题讨论】:

  • I know the difference in their memory allocation and mapping 您的问题表明您实际上并不知道...
  • @BradleyDotNET 传播值类型在堆栈上的想法只会导致问题。值类型不会放在堆栈上,它们会放在相关变量的特定存储位置所在的任何地方,这几乎可以在任何地方,包括堆栈、堆或两者都没有。
  • 这解决了什么问题? .Net 的特性之一是让程序员无需了解这一点。除非您确实遇到问题,否则这不是一个好问题。
  • 另外,The Truth About Value Types 在 Microsoft 在桌面 CLR 上的 C# 实现中,当值是局部变量或不是封闭的临时变量时,值类型存储在堆栈中lambda或匿名方法的局部变量,方法体不是迭代器块,jitter选择不注册值

标签: c# .net


【解决方案1】:

引用将在堆栈上创建(或者更具体地说,它将是结构所在的位置)。

该引用将有一个默认值(null),因此不会在结构构造时创建 String 对象。

通过字符串构造函数分配字符串时,会在堆中创建字符串对象和字符串缓冲区。

【讨论】:

    猜你喜欢
    • 2012-08-06
    • 2012-07-20
    • 2010-11-10
    • 2015-04-29
    • 1970-01-01
    • 1970-01-01
    • 2014-09-21
    • 2011-01-25
    • 1970-01-01
    相关资源
    最近更新 更多