namespace @string
{
    class Program
    {
        static void Main(string[] args)
        {
            string s1 = "Jerryzhang";
            string s2 = s1;
            Console.WriteLine(s1);
            Console.WriteLine(s2);
            s1 = "hello world";
            Console.WriteLine(s1);
            Console.WriteLine(s2);
        }
    }
}

res1

namespace @string
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] Arri1=new int[]{10};
            int[] Arri2 = Arri1;
            Arri2[0] = 666;
            Console.WriteLine(Arri1[0]);
            Console.WriteLine(Arri2[0]);
        }
    }
}


res2

     第一段段代码中修改了string s1的值,这样的话,可能会容易犯错误,因为我们一般理解数组的时候是这么讲的

我们说引用类型和值类型的区别在于值类型存储在堆栈中,而引用类型在堆栈中只存储了一个堆中的地址,把

真正的数据放在托管堆中,这样我们觉得如果是数组那么它在堆栈中的地址是指向托管堆中的一个特定的单元

那么我们把数组赋值的话,就是在对栈中开辟一个空间来存储Arri2,把这个Arri2指向Arri1所指向的单元,那么我们修改

Arri1的数据,那么Arri2也会随着变化,因为他们指向同一个堆中的单元!就像第二个例子一样!

但是,结果是不一样的。

    结论string类型和Array虽然都是引用类型,但是如果修改string母串,那么会从新为母串开辟一个新的堆单元,

而它赋值给别的引用的是不变的,就如上例中s2还是指向原来的单元,所以值不变!

    还有就是有的朋友喜欢在声明如上例的第二个数值时,喜欢这么写int[] arri2=new int[1];

其实这个没必要也不应该这么写,这样会造成在托管堆中产生系统垃圾,浪费了资源!

posted on 2009-04-20 16:49  Jerryzhang  阅读(3950)  评论(2编辑  收藏  举报