为什么说String不能被修改

.Net技术 码拜 9年前 (2016-04-30) 1086次浏览
看到String这一章时做了一下测试

 
            String a = "me";
            String b = a;
            Console.WriteLine(a);//me
            Console.WriteLine(b);//me
            a = "meeeee";//重新a赋值
            Console.WriteLine(a);//meeeee
            Console.WriteLine(b);//me

书上说字符串不能被修改,之所以能重新赋值是原因是新建了字符串。
想了解下,上面哪句代码让字符串重新建的?  还有谁指向的谁?堆和栈是怎么存放的。

解决方案

10

msdn机翻太渣,还是请看原文https://msdn.microsoft.com/zh-tw/library/362314fe.aspx

10

你可以这样测试一下

using System;
using System.Diagnostics;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            String a = "me";
            String b = a;
            Console.WriteLine(a);//me
            Console.WriteLine(b);//me
            Debug.Assert(a.GetHashCode() == b.GetHashCode());
            Console.WriteLine("hashcode_a={0},hashcode_b={1}", a.GetHashCode(), b.GetHashCode());
            a = "meeeee";//重新a赋值
            Console.WriteLine(a);//meeeee
            Console.WriteLine(b);//me
            Debug.Assert(a.GetHashCode() != b.GetHashCode());
            Console.WriteLine("hashcode_a={0},hashcode_b={1}", a.GetHashCode(), b.GetHashCode());
            Console.WriteLine("\r\n\r\n.................按任意键继续");
            Console.ReadKey();
        }
    }
}

10

=号就会创建一个新的字符串对象
每次修改都会新建对象
另外,由于这个原因,假如拼接字符串的话,最好用stringbuilder类,否则效率低

10

引用:

我们说,string 是一个特殊的引用类型
他具有值类型的特点。…

其实在”不能被修改上”,string也没有什么特殊的。
例如下例是本人写的引用类型,一样是不可修改:

class MyImmutable
{
    public MyImmutable(int v)
    {
        this.Value = v;
    }
    public int Value { get; private set; }
    public MyImmutable Add(MyImmutable other)
    {
        return new MyImmutable(this.Value + other.Value);
    }
    public override string ToString()
    {
        return Value.ToString();
    }
}
static void Main()
{
    MyImmutable a = new MyImmutable(1234);
    MyImmutable b = a;
    Console.WriteLine(a);//1234
    Console.WriteLine(b);//1234
    a = new MyImmutable(5678);//重新a赋值
    Console.WriteLine(a);//5678
    Console.WriteLine(b);//1234
}

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明为什么说String不能被修改
喜欢 (0)
[1034331897@qq.com]
分享 (0)