我想大家都知道值类型和引用类型的区别,但我想到一个问题,如下声明一个Person类:
public class Person
{
    string strName="";
    int age=0;
    .
    .
    .
    .
    .
    .
}
现在我申明一个Person对象person,person当然是引用类型,存放于托管堆中,但person对象也有个int类型的age,age应该存储于托管堆栈才对是吧?那存储age的托管堆栈和存储person的托管堆是怎样联系起来的呢?多谢各位大虾赐教,最后祝各位大虾新年快乐,虎年行大运!

解决方案 »

  1.   


    因为age在person里,所以在托管堆里。每当你运行一个托管程序,都会初始化一个托管堆,这个程序需要放在托管堆里的东西都放在这同一个堆里。
      

  2.   


    不能理解
    我的问题中age并不是引用类型,仅仅是person对象是引用类型,准确的说我是想知道age在内存中与person对象在内存中的关系
      

  3.   


    您的意思是在person存储的托管堆中再开辟一个托管堆栈保存age?
      

  4.   

    虽然Age是值类型,但它是Person的一部分,Person是一个数据结构了,其在内存中的分配是一块连续的地址
    你可以分别打出Age和StrName的内存地址看看就知道了,它们是靠在一起的,都随Person这个整体分配在堆上只有你的数据类型是值类型的时候,才会分配到栈上,这也就是又微又软不建议设计较大的结构的原因,如果结构较大,建议设计成类要以Person这个类的整体眼光来观察,不要看里面具体的字段,所谓子随母走,就这个道理
      

  5.   


    您的意思也是在person存储的托管堆中再开辟一个托管堆栈保存age?
      

  6.   


    有点明白,但还是没完全理解到...
    那此处的age可以确定是保存在person所在的堆中了,但age是在堆中分配堆栈保存的还是直接保存在托管堆的非托管堆栈中?还是没说明白这个问题... ...
      

  7.   

    UP up UP up UP up...
      

  8.   

    没有哪本书说过“值类型一定分配在栈上”
    你能看到的仅仅是“值类型可以分配在栈上”
    所以引用类型Person里面的int age分配在堆上有什么不妥吗?
      

  9.   

    看一段C程序你会更明白一些:#include <stdio.h>
    typedef  struct _Test{
    int x;
    int y;
    char* cs;
    }Test;int main()
    {
    Test t;
    t.x = 22;
    t.y = 55;
    t.cs = "wabbee"; Test* p;
    p = &t;

    int* m = (int*)p;//结构名代表该结构的首地址,即C++中的类名就是类的首地址,所以能这样转
    printf("x:%d\n",*m);//输出 22
    printf("x's address:0x%x\n\n", m);//t.x的地址:0X240FF18
    m++;
    printf("y:%d\n", *m);//输出 55
    printf("x's address:0x%x\n\n", m);//t.y的地址:0X240FF1C
    m++;
    char* s = (char*)(*m);
    printf("s:%s\n", s);//输出 "wabbee"
    printf("x's address:0x%x\n\n", m);//t.cs的地址: 0X240FF20

    return 0;
    }
    注意三个指针的值(代表结构的三个变量)是紧紧靠在一起的,每个指针占用4个字节:
    0X240FF18 //整数X的内存地址
    0X240FF1C = 0X240FF18 + 4//整数Y的内存地址
    0X240FF20 = 0X240FF1C + 4//指向字符串cs的指针的地址以上表明,一个自定义的数据类型,在内存中分配的内存是一个连续的块