写了一段测试代码,见下面。关于内存,out 关键字,等有不少疑问。
期待高手解答。
谢谢先。        PassData pass1;
        PassData pass2;
private void TestStructOut()
{  
            int id = 2;
            TestStruct.OutStruct(id, out pass1);
            id = 4;
            TestStruct.OutStruct(id, out pass2); 
 //测试发现
// 1  结构是值传递;
//  2   pass2.feed与pass1.feed没有任何关联。
//  疑问: 结构体的成员feed是在静态函数OutStruct内申明的,out传出来,它的生存期有多长?或者说,现在pass1与pass2的数据成员feed在整过生存期内都可靠吗?
谢谢。
}  struct PassData
    {
        int  ID;
        int pass;
        int[] feed;
        public PassData(int id)
        {
            ID = id;
            pass = id + 10;
            feed = new int[pass];
            for (int i = 0; i < pass; i++)
            {
                feed[i] = pass * i;
            }        }    }
    class TestStruct
    {
        static public void OutStruct(int id, out PassData pass)
        {
            pass = new PassData(id);
        }
    }

解决方案 »

  1.   

    继续测试:  
              PassData pass3;
                pass3 = pass1;
                pass3.feed[0] = 10;  // 这时pass1.feed[0]也改了,说明,这两数据结构的feed是指向统一内存
                pass3.pass = 3;  //而这里,并不改变 pass1的pass数据。
      

  2.   

    out和结构的生存周期没有什么关系,其实out不是把结构传出来,而是把pass1/pass2的地址传给OutStruct方法,OutStruct引用它们的地址并改变这两个结构实例的内容,pass1/pass2的生存周期是定义它们的地方决定的,看样子应该是类变量,和类实例生存周期相同,没用的时候会被垃圾回收机制回收,
      

  3.   

    feed = new int[pass];这句话就导致了pass1/pass2的feed成员没有任何关系,至于feed的生存周期,要看是否还有引用,其实pass1/pass2只要还存在,也就是pass1/pass2所在的类实例没有被回收,feed就会被引用,就不会被回收,pass1/pass2的生存周期和他们所在的类实例相同,和OutStruct方法无关,OutStruct方法只是接收了pass1/pass2的地址而已,不会影响它们的生存周期,也不会决定pass1/pass2在堆还是在栈了,这个情况应该是在堆里,至于feed作为引用类型,它肯定是在堆里分配,只要还有引用,feed就不会被回收,