最近对值类型和引用类型之间的问题越来越迷惑了
具体问题有以下几个1,值类型是存储在堆栈上的,但在C#中,所有的东西都要包含在一个类当中,但类的空间是分配在托管堆中的。当实例化一个类的时候,这个类有一个值类型的变量,这个变量的内存分配到底是在托管堆中啊还是在堆栈中啊?2,struct是值类型的,但如果在struct当中有个string类型的变量,那这个string的变量到底是在哪分配空间啊?3,string 是个引用类型,有如下代码:
    class Program
    {
        static void Main(string[] args)
        {
            string testone = "this is a test";
            string testtwo = testone;
            Console.WriteLine("testone is "+testone);
            Console.WriteLine("testtwo is "+testtwo);
            testone = "another string";
            Console.WriteLine("testone is " + testone);
            Console.WriteLine("testtwo is " + testtwo);
        }
    }这个时候,输出结果为
testone is this is a test
testtwo is this is a test
testone is another string
testtwo is this is a test既然string为引用类型,为什么改变了testone,但testtwo确没改变呢?
以上几个问题还希望高手能够指教

解决方案 »

  1.   

    1.在c#中,所有从System.ValueType继承过来的类型都是值类型,其他的都是引用类型,值类型分配在堆栈中,引用类型分配在托管堆中。一个引用类中的值类型分配在托管堆中。
    2.struct中的引用类型也是分配在托管堆中,struct只是保留对他的引用而已
    3.string是一个比较特殊的引用类型,
    string testone = "this is a test";
    string testtwo = testone;
    这段代码分配了两个字符串空间,即testone指向一个"this is a test";testtwo指向另外一个"this is a test";所以当你改变了testone时,testtwo并没有被改变。你可以使用字付串驻留技术使他们指向同一个字符串。
      

  2.   

    谢谢楼上大哥
    打个比方
    class test
    {
          public int i;
    }当我实例化这个类,并且对i进行赋值后
    test aa=new test();
    aa.i=10;这里,显然aa这个类的实例是在托管堆上分配内存
    那么,aa当中的这个int型的变量i,是在堆栈中还是托管堆中?
    还是aa当中只保存了i的指针,i的内存分配还是在堆栈上?
      

  3.   

    针对你的问题我写了如下函数:
    using System;public class RefType
    {
        public int i;
    }
    class RefTypeTest
    {
        public static void Main()
        {
            RefType rect1 = new RefType();
            rect1.i = 100;
            RefType rect2 = rect1;
            Console.WriteLine("rect2.i=" + rect1.i);
            rect1.i = 200;
            Console.WriteLine("rect2.i=" + rect1.i);
        }
    }
    结果如下:
    rect2.i=100
    rect2.i=200
    ——————————————————
    看来就算是对象中的int类型也是存在托管堆中的