昨天看到有些帖子问关于string的问题,才发现我是多么的无知,把string看成和int等一样的,简单的数据类型。
那么现在有个问题:MSDN记录阐述的是string一旦赋值,那么它将永恒不变,所谓的改变,也只是改变了其引用的,地址中的值将不会变,只是改变了之后原地址中的值没人引用它了罢了,同时,假设有string x="hello";  string y="hello";那么,其实在内存中只有一块hello,x和y同时指向它罢了,不知道我的理解是否正确,那么现在的问题是:
若:string x="hello";
    string y="hel";
    y+="lo";
这样的话,x和y事什么关系呢??还是上面的那个假设吗?

解决方案 »

  1.   

    假设有string x="hello";  string y="hello";那么,其实在内存中只有一块hello,x和y同时指向它罢了
    ==========>
    这是谁告诉你的?
      

  2.   

    这我好像以前看过一个帖子,说如果经过优化的话,x和y可能是指向同一个“hello”对象。
      

  3.   

    http://terrylee.cnblogs.com/archive/2005/12/26/304876.html这里看的?这样理解不可以的吗?
      

  4.   

    我也不知道这句话对不话,个人觉得有不太可能,
    如果是这样,每声明一个string,程序都要去搜索内存中所的String,比较值是否相同,但是这个比较的时候就需要先声明一个String要不怎么比较?
      

  5.   

    对啊,万一有10个string对象在内存中,当申明第11个的时候,如果存在于前10个中某个相等,那么,滴11个他就不会再新的生成第11块空间,而是,直接指向前10个中那个与自己相等的哇,这句话我也不知道怎么在说,有没有说清楚,不知是否这样?
      

  6.   

    Jeffery Ritcher在CLR Via C#中说:CLR初始化的时候会创建一个哈希表,记录字符串字面量的使用情况。所以,的确会出现这种字符串留用的情况。但他又说:我们不应该对此做出假设,因为将来的实现可能会改变这一情况。不过我还是很佩服慕白兄,论坛中大多是人云亦云,没有自己的观点。
      

  7.   

    string a = "a";
    string b = "a";
    string.ReferenceEquals(a,b)就可看到效果
    新建一个字符串以后,将为其分配内存,而之后有值和其相同的字符串不会被创建分配堆而是直接分配其引用
      

  8.   


    确实是指在一块内存的,string在托管堆中是维护在hasttable中的,每次重新申明一个String的时候,首先检查这个hashtable中是否已经存在了相同的String内容,如果有,则指向同一块堆内存,如果没有,那么重新申请堆内存,并且将新的string存入Hashtable.string a = "a";
    string b = "a";
    此时string.regerenceEquales(a,b)返回True但是如果再来一句
    b= "c";
    那么重新分配内存。
      

  9.   

    首先谢谢那些真诚地在提自己观点的朋友,比如wuyq11
    但是我又想说,某些人不怎么清楚,你写个学习也好,但不要误导,谢谢,这是罪过
      

  10.   

    string是固定的。
    对string做连接运算,必须创建一个新的字符串对象,拷贝进来,然后丢弃原来的。
    要想连接运算,用StringBuilder类。