标签:tps imm mutable ref table 内存 tab 模块 get
刚接触C#时,书上说string是一种特殊的引用类型,因此string类型变量在作为参数传递到另一个方法,被修改后原变量的值不会发生变化,当时看得我一脸懵逼,什么叫特殊...。后来又听说字符串是不可变的(immutable),也就是说字符串一经创建便不能更改。今天就来探究一下所谓的特殊到底特殊在哪里,借助的手段是通过VS及时窗口查看变量堆栈地址(&VariableName).
由上图可以看出,相同的非字面值字符串堆地址是不一样的,若想只存在一个副本可通过暂存池(如果应用程序不在保持对原始字符串的引用,GC就可释放那个字符串的内存),详情请看NSDN:String.Intern
从上图可以看出,strValue跟mStrValue的堆地址是一致的,也就是说字符串传参跟普通引用类型传参是一样的,都是传入的引用地址。那么问题来了,既然地址都传进去了,为什么字符串修改后原字符串不发生变化呢?原因就在上一条,字符串的不可变性,当方法中的字符串变量值发生变化后,字符串变量将会指向一个新的地址,原地址的值不变,因此原字符串的值不会发生变化。
标签:tps imm mutable ref table 内存 tab 模块 get
原文地址:http://www.cnblogs.com/kai364/p/6512559.html