none
请教C#中String问题! RRS feed

  • 问题

  • MSDN上关于string类型这样说

    字符串是不可变的,即:字符串对象在创建后,尽管从语法上看您似乎可以更改其内容,但事实上并不可行。例如,编写此代码时,编译器实际上会创建一个新字符串对象来保存新的字符序列,变量 b 继续保存“h”。

       string b = "h";
    b += "ello";
    
    变量b继续保存“h”,那输出时是怎样输出“hello”的啊?这是一个怎样的过程啊?请高手指教!
    2010年4月23日 10:53

答案

  • 我在这里说下上面那两句代码是怎么执行的:

    1)创建一个System.String类型的对象,并初始化文本"h",此时.NET运行库为该字符串分配足够的内存来保存这个文本,再设置变量b,表示这个字符串实例;

    2).NET运行库再创建一个新的字符串实例,给它分配内存保存从b的地址复制过来的"h"和"ello"的合并字符串。之后更新存储在b中的地址,使b正确的指向新的字符串对象。

    3)至此,原有的地址保存的"h"并未发生改变,依然存在,只是没有任何的变量引用它了。下次垃圾回收的时候就会被删除。

    我在这里也不是很明白b继续保存"h"的意思,估计是初始时b引用的地址继续保存"h"。

    • 已标记为答案 刘伟伟 2010年4月23日 12:19
    2010年4月23日 12:14

全部回复

  • 在C#中,有两种类型:引用类型(如:string)和非引用类型(如:int)。引用类型指向的其实是一个内存地址,你的例子中:

    string b = “h”;

    b += "ello";

    这时实际上是相当于重新创建了一个string 对象b,b的值是“hello”。

    • 已编辑 络绎 2010年4月23日 11:11 Add more messages
    2010年4月23日 11:07
  • 很感谢你的回答,那么请问MSDN中解释的b继续保存“h”是什么意思啊?谢谢你!
    2010年4月23日 11:35
  • 我在这里说下上面那两句代码是怎么执行的:

    1)创建一个System.String类型的对象,并初始化文本"h",此时.NET运行库为该字符串分配足够的内存来保存这个文本,再设置变量b,表示这个字符串实例;

    2).NET运行库再创建一个新的字符串实例,给它分配内存保存从b的地址复制过来的"h"和"ello"的合并字符串。之后更新存储在b中的地址,使b正确的指向新的字符串对象。

    3)至此,原有的地址保存的"h"并未发生改变,依然存在,只是没有任何的变量引用它了。下次垃圾回收的时候就会被删除。

    我在这里也不是很明白b继续保存"h"的意思,估计是初始时b引用的地址继续保存"h"。

    • 已标记为答案 刘伟伟 2010年4月23日 12:19
    2010年4月23日 12:14
  • 恩,明白了,很感谢你!
    2010年4月23日 12:19
  • 你好!

         应该是翻译的问题,英文原文是这样的:

    For example, when you write this code, the compiler actually creates a new string object to hold the new sequence of characters, and that new object is assigned to b. The string "h" is then eligible for garbage collection.

         例如,编写这段代码的时候,编译器实际上创建了一个新的string对象来保存新的字符序列,并把这个新的对象赋给b,然后字符串“h"符合垃圾回收的条件!


    周雪峰
    2010年4月24日 2:11
    版主
  • 你好!

         应该是翻译的问题,英文原文是这样的:

    For example, when you write this code, the compiler actually creates a new string object to hold the new sequence of characters, and that new object is assigned to b. The string "h" is then eligible for garbage collection.

         例如,编写这段代码的时候,编译器实际上创建了一个新的string对象来保存新的字符序列,并把这个新的对象赋给b,然后字符串“h"符合垃圾回收的条件!


    周雪峰

    嗯,看到英文就知道是翻译错了,呵呵,昨天倒没查msdn。
    2010年4月24日 2:50
  • 很感谢你的回答,对我很有帮助!

    2010年5月6日 12:14