查找了一些资料,说数组属于引用类型,在堆栈上存储一个地址引用,而真正的值存储在托管堆中.    可是,我有一个不明白, 例如 string[] t=new string[3]; 
     是在堆栈中存储t[0]在地址,然后再在托管堆中开辟三个连续的字节存放 t[0],t[1],t[2]
     还是在堆栈中存储三个地址的引用,分别指向托管堆中的 t[0],t[1],t[2]  另外值类型的数组,如 string[] t=new string[3];int[] tt=new int[3];如此实例化但不赋值,系统会赋给默认值,
  但是 
    Thread[] td=new Thread[3];             --第一行
    td[0]=new Thread(new ThreadStart(M));  --第二行  线程初始化时需要委托参数,但是上面这样写也可以, 那么第一行算是声明还是实例化!? 在内存中又该怎么体现!?!?    很费解, 也查了一些资料,不过仍然不理解, 希望这里大哥大姐可以给予提示和指点..  非常非常感谢!!

解决方案 »

  1.   

    应该就是这样的我觉得,但是我很业余
    第一行Thread[] td声明了线程数组td,td=new Thread[3]实例化线程的数组td,第二行实例化td中的第一个对象td[0].
    第一行实例化的只是线程的数组,第二行才是真正的实例化线程. .net中数组也是对象,继承于System.Array,是引用类型,于是和一般的引用类型对象一样,用之前也需要实例化,可以认为实例化出来的只是一个容器,容器中的对象还是需要手动创建的.
      

  2.   


      不明白.. 请问,你的意思是说,
      对于Thread[] td=new Thread[3]; 先在堆栈中开辟一个单元,存储一个指向托管堆中的引用..
        然后在托管堆中在开辟三个单元,t[0],t[1],t[2],那么托管堆这三个单元有值么!? 单元大小(字节)又是多大呢..!?
      另外还想问一下,在堆栈中的单元又是多大!?实例一个类时,在堆栈中 存储一个指向类的引用  的大小应该和这个堆栈中的大小一样吧.!?   5楼你谦虚了.. 至少比我专业多了  ..  - -!
      

  3.   

    如果是string或者其他对象类型的话,存的是地址。要是值类型,比如int,存的就是值
      

  4.   

    另外值类型的数组,如 string[] t=new string[3];int[] tt=new int[3];关于楼主的这句话,先说string不是值类型说下我对数组的理解: 数组的基类是arry[],所有数组都是继承与arry[],值类型数组与引用类型数组其实都一样,唯一不一样的在给数组赋值时候是否需要隐形转换,以及取值的时候是否需要显示转换,当然这个在内部进行。 Thread[] td=new Thread[3]; --第一行
     td[0]=new Thread(new ThreadStart(M)); --第二行
    第一行应该是在栈上定义变量,在托管堆上分配内存。
    第二行设置托管堆上的第一个的值
      

  5.   


    汗,数组存储都是object类型,你从int类型转换成object需要隐形转换,你从object变成int需要显示
      

  6.   

    1.数组找个指针指着它的头部就可以了,其他的元素地址可以计算出来。2. .Net 只会为 int 默认赋个 0 上去,但是不会管 string,跟不会管任何对象的实例化3. Thread[] td=new Thread[3];  它只是建立了一个指针数组,你也可以理解为 int 数组,没有任何对象被初始化。
      

  7.   

    这个似乎应该是不对的
    arraylist存的才是object类型
      

  8.   

    楼主,建议不要用String 做示例,string 是个引用类型,用值类型做堆或栈的测试!~引用类型:类,string
    值类型 :int,char 结构!~