C#中字符串的修改

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];

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

转载于:https://www.cnblogs.com/jessie/archive/2009/04/20/Jerry.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值