1.媒介
string是属于援用范例的,这个人人都晓得吧?然则平常在运用的过程当中,发明它照样具有一些值范例的特性的,这究竟是为何呢?
缘由就是.Net考虑到假如大批的操纵string对象的时刻,大批对援用对象举行操纵的时刻,机能一定不如值范例来的直爽。.Net为了进步这个机能,供应了一个特地的解决方案:字符串驻留池!
2.正文
先让我们来看一段代码:
string str1 = "aa"; string str2 = "a" + "a"; Console.WriteLine(ReferenceEquals(str1, str2)); //print:true
这str1跟str2的内存指向地点居然是如出一辙的!
缘由是.Net在CLR内部保护了一个Hash表(实在就是前文说的字符串驻留池),key为字符串内容,值就是所指向的托管堆的地点;当初始化建立了一个新的字符串的时刻,.Net就会去这个Hash表中搜刮是不是有雷同的值,假如key雷同,就会把已存在的字符串的地点值赋给新建立的字符串,假如不存在则重新分配地点,这就是为何上面这个代码的内存为true。
再让我们来看别的一段代码:
string str3 = "ab"; string str4 = "a"; str4 += "b"; Console.WriteLine(ReferenceEquals(str3, str4));//print :false
之所以涌现了false,请注意上一栏的关键字“初始化建立”,当字符串是动态建立的时刻,.Net并不会去Hash表中搜刮是不是有建立,而是直接建立;
假如想对上面的代码优化一下而且对机能有更(xian)高(de)追(dan)求(teng),我们能够手动将这个字符串加入到字符串驻留池中举行对照
string str3 = "ab"; string str4 = "a"; str4 += "b"; str4 = string.Intern(str4);//Intern:它会去字符串驻留池中搜刮,假如找寻到的话则返回对应的地点 Console.WriteLine(ReferenceEquals(str3, str4));//print :true
3.总结
末了对string下点结论:
1.string在clr中不是用newobj指令建立,而是用ldstr指令建立!而且string具有值范例的特性,然则在内存上是援用范例,存在托管堆上面;
2.string是sealed润饰的,所以不能被子类集成;
3.当建立内容雷同的时刻,string是指向统一地点的,而且每次操纵string都邑生成新的地点(string的恒定性);
4.关于大批拼接的话照样运用StringBuilder,它是动态的不像string是恒定的,但就是建立StringBuilder价值比较大,所以小拼接用string在机能上能够还更好!
以上就是C#中 特别的string范例代码示例详解的内容,更多相关内容请关注ki4网(www.ki4.cn)!