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相关文章
- c语言 字符串 网址 编写一个c语言程序:输入字符串s,将s中的前导空格和尾随空格删去,中间连续多个空格缩减为一个空格。
- 举例说明语言和言语的区别 JAVA语言和C/C++语言有什么异同?
- c语言向函数传递数组指针 在C#中实现类似C++函数指针数组的功能
- C语言是编译执行的语言 请问Linux 下进行C语言 的开发,一般用什么软体,我指的是那种像VC++一样的有没有。
- c语言给指针变量赋值 C++把一个字符串用指针赋值给另一个字符串
- 初学c语言看什么书好 C语言没有学好,可以学c++吗,C语言,c++,c#之间有什么关系。求解
- 双向建构 c++中建构函式可以在类外定义吗
- C语言标识符 C语言 ++t与+=t有什么不同
- 列举java语言的优点 java语言与c++相比,有哪些优点?
- 字符串类有哪两种 开发JAVA编程中字符串分割的两种方法
爱学记

微信收款码
支付宝收款码