c++ string转int 对string类型和stringBuilder类型的研究
对string类型和stringBuilder类型的研究
using System;using System Collections Generic;using System Text;
namespace TestString{ class Program { static void Main(string[] args) { //在一次群组讨论中 谈到了string的类型问题 虽然它是引用类型 却具有很多值类型的特点 关于这个问题 做了如下研究 //由于程序中可能存在大量的相同字符串 为了节省内存 C#应该是将下面两个变量都引用存放在同一个栈的 test ! string myString = test ; string myString = myString ; //那么按照引用的理论 修改其中的一个字符串 另一个就应该跟着改变 例如做如下修改 myString = New test ; Console WriteLine(myString ); //此时按理说myString 应该也变成 New test 但事实上经过测试 myString 还是 test 这是为什么呢? //我分析 微软应该是在string类型中引入了copy on write技术 就是说 我们在修改string类型变量的时候
//其实是重新开辟了一块内存 将修改后的内容放进去 //再利用 = 把修改后的数据所在栈的地址传给被修改的字符串变量 来达到修改字符串变量的目的! //下面的测试很好的说明了这个问题 myString Replace( t a ); Console WriteLine(myString ); //myString Replace( t a );方法是把该字符串中的字母t换成字母a 但是经过测试myString 的内容依然是 test
//这就是因为虽然开辟了新空间并且将修改后的值存了进去 //但是没有用 = 将新数据栈的地址传给myString
所以myString 的值没变!
//与string类型相对应 StringBuilder类型则有所不同 StringBuilder mySb = new StringBuilder( test ); StringBuilder mySb = new StringBuilder( test ); //StringBuilder类型在引用存放数据的栈之前加入了一个中间栈 也就是说 mySb 指向它的中间栈

//假设这个中间栈叫stack 然后stack 再指向存放 test 的栈 //mySb 也指向它的中间栈stack 然后stack 也指向存放 test 的那个栈 当mySb 被修改时
//依然是采用copy on write技术 但是开辟新的栈并且把修改后的数据放进去后 //会自动修改stack 让他重新指向新的数据栈 而mySb 一直还是指向中间栈stack
//这样就实现了直接的修改 而不用使用 = 来传递新地址给mySb 看下面的测试 mySb Replace( t a ); Console WriteLine(mySb ); //果然 mySb 被成功修改了! //Ps 以上代码虽然有些警告 但是可以运行 主要是专注于说明问题 忽略了一些细节 比如赋值了的变量未使用等问题 望见谅!
lishixinzhi/Article/program/net/201311/13532