参看以下代码片断,选正确的表述项目:( ) (选1项)
String myStr=”Tom”;
string yourStr=”Jerry”;
A)myStr会保存在堆栈中,yourStr会保存在堆中
B)myStr会保存在堆中,yourStr会保存在堆栈中
C)myStr与yourStr都会保存在堆栈中
D)myStr与yourStr都会保存在堆中网上答案是B ,有几个问题不明白,请大家帮忙分析下:
1.这里说的堆栈是指栈还是指堆和栈2部分 
2.C#中的堆栈和计算机系统中的堆栈是否相同
3.据介绍string对应的就是String 只不过做了封装处理看起来和值类型相似,那么为什么string就存在了堆栈了??
4.引用类型到底是只存在于堆中 还是堆栈中?

解决方案 »

  1.   

    答案应该是D。
    引用类型都保存在托管堆中。
    堆:Heap
    堆栈:Stack
      

  2.   

    显然是D,估计听力不好。B,D不分,我们高中时候的读法就是用拼音读D
      

  3.   

    System.String 和 string 是一回事,是引用类型。不存在 string 是值类型的说法。string 是 .NET 类型 System.String 在 C# 中的别名而已。
      

  4.   

    1.这里说的堆栈是指栈还是指堆和栈2部分 堆栈:Stack,就是指栈,不是指堆和栈2部分。
    2.C#中的堆栈和计算机系统中的堆栈是否相同C#中的堆栈就是Stack,就是计算机系统中的栈。
    3.据介绍string对应的就是 String 只不过做了封装处理看起来和值类型相似,那么为什么string就存在了堆栈了??string 就是 Sytsem.String,是引用类型,保存在托管堆(Heap)中,不是在堆栈(Stack)中。4.引用类型到底是只存在于堆中 还是堆栈中?引用类型只存在于堆(Heap)中。
      

  5.   

    如果是局部变量那肯定是在栈上,但是引用的内容则是在堆上。
    用c来描述就是
    char *myStr = strdup("Tom");
    char *yourStr = strdup("Jerry");
      

  6.   

    1.这里的堆栈应该是指的栈吧
    2.不相同 c#中的是托管堆栈
    3.String 是通用类型系统CTS中的写法,string是C#中的类型对应的,翻译成MSIL就是String
    4.引用类型 在栈中放引用在堆中放数据
      

  7.   

    我们是读作Apply,Boy,Cat,Dog
      

  8.   

    很简单的问题. D.string 怎么弄都在托管堆中.死记这个就够了.string 是个特殊的引用类型.当然,用起来像是值类型,其实不是.堆栈不用研究...没太大意义.真想研究,放弃C# 去搞windows核心编程吧.
      

  9.   

    String是string在公共类型中的一个类描述,某种程度上可以理解为两者是一样的,在使用某些跨平台的功能时建议使用String而不是string。关于楼主的答案,显然是错误的,首先需要理解什么是栈,什么是堆,什么是堆栈。栈是一种数据结构,在现代计算机中这种数据结构已经是CPU的基本结构之一。特点:后进先出
    堆也是一种数据结构,管理大片内存时使用(当然小片的也能管理),根据堆的用途不同,实现的数据结构也不同,实现的复杂程度也不同。(比如优先队列等)
    堆栈是对这两种数据结构的称呼(我这么认为)一般表示保存在内存中的数据(内存中的大部分数据都是按照堆或者栈来保存的)。栈又叫做自动内存,有点像托管堆,它能自动分配自动释放,这是由操作系统保证的,操作系统在调用函数的时候会为函数分配栈空间,调用完之后会释放刚才分配的栈空间(由调用方释放还是被调方释放不同的平台有不同的实现),从而保证栈平衡。
    堆在操作系统里面很常见,在.NET里面主要是托管堆,托管堆是由操作系统的堆分配器在某块儿连续的大内存区域划分出来的一片保留内存,CLR负责这个堆的管理工作。楼主的两个实例均分配在堆上,但是他们的引用保存在栈上(这是另外一个话题)。就你的问题来说这两个对象的实例是保存在托管堆上的,可以看下面的例子,以示证明:static void Main(string[] args) {{
    string s1 = "abc";
    String s2 = "cde";
    }我们用windbg来调试这个程序:
    首先我们可以知道(!eeheap -gc):当前这个.NET程序分配的托管堆从0x024d1018开始(0代的起始地址),其他代不列了。
    其次我们可以从内存中找到这两个实例,他们的地址分别是:0x024dc018和0x024dc02c
    最后我们可以打开地址0x024dc018和0x024dc02c,(!do add)可以看到这里确实保存的是类型为5a15d2b8的对象,该对象长度为3,内容分别是abc和cde。另外我们可以看到这里保存的托管类型是一样的,他们都是5a15d2b8。内存布局如下:0x024DC018  b8 d2 15 5a 03 00 00 00  ??.Z....
    0x024DC020  61 00 62 00 63 00 00 00  a.b.c...
    0x024DC028  00 00 00 80 b8 d2 15 5a  ...€??.Z
    0x024DC030  03 00 00 00 63 00 64 00  ....c.d.
    0x024DC038  65 00 00 00 00 00 00 00  e.......个人理解,仅供参考。
      

  10.   

    答案应该是D。
    引用类型都保存在托管堆中。
    堆:Heap 也叫托管堆
    堆栈:Stack 也叫栈
    值类型与引用类型,可以到网上查下
      

  11.   

    System.String一个引用类型
    CLR会在托管堆(Managed Heap)中分配内存快
    一般的引用对象的创建是通过newobj这样一个IL指令来实现的,
    而创建一个字符串变量的IL指令则是ldstr 
    CLR内部维护着一块特殊的数据结构—Hash table,Hash table维护大部分创建的string
      

  12.   

    1.这里说的堆栈是指栈还是指堆和栈2部分 
    堆栈指的肯定是 栈(stack),堆是heap。这个是老的计算机教材的翻译导致的。现在的教材基本上都不再使用堆栈来翻译stack。2.C#中的堆栈和计算机系统中的堆栈是否相同
    完全相同3.据介绍string对应的就是String 只不过做了封装处理看起来和值类型相似,那么为什么string就存在了堆栈了?
    string依然存放在堆中。
    string只是String的别名。String是引用类型。所有的引用类型都存放在堆中。4.引用类型到底是只存在于堆中 还是堆栈中?
    所有的引用类型都存放在堆中。
      

  13.   

    答案应该是D,Sting和string是同一东西,只是别名不同而已。字符串类型是引用类型,引用类型会在栈上创建变量标签,其内容在堆上保存,栈上只保存堆的地址。
    在这个层面你可以理解计算机的内存一般分为两部分,堆栈(一般也叫栈),堆(C#中托管堆),值类型数据一般直接在栈上创建并初始化,引用类型一般在栈上创建标签,在堆上保存数据,所以当你定义一个int数据时没有给其初始值,它也有一个初始值,而string就会为null,就是这个原因。
    栈的速度相对快,而空间有限,堆反之。
    至于如何使用,根据特性自己体会吧。
      

  14.   

    谢谢各位  
    对于答案的解释 现整理于http://blog.csdn.net/shao5155285/archive/2010/05/18/5604970.aspx
      

  15.   

    这题确实是B没有错
    首先 String和string没有任何区别 都是引用类型
    题目问的是myStr和yourStr
    "Tom"和"Jerry"保存在堆里没有错
    可是myStr和yourStr这两个变量保存在栈里