码迷,mamicode.com
首页 > 其他好文 > 详细

字符串String类

时间:2015-07-26 17:17:35      阅读:118      评论:0      收藏:0      [点我收藏+]

标签:

1. String类是一个密封类。用关键字sealed修饰;

2. 字符串的两个特性:

????·不可变性:string类型变量,一旦声明就表明它是不会被改变的。因此,string中的方法对string类型的变量进行处理之后都需要返回值来接收。比如说:ToUpper()【将字符串转化为大写的形式】ToLower()【将字符串转化为小写形式】。

????那么有这么一种情况和前面说的有点矛盾?

????string s1="abc";

????string s2="x";

????s1=s1+s2;

????Console.WriteLine(s1);//abcx

????这个问题看下面的图:

????技术分享对于:str1=str1+str2;先是进行加法,之后就会在内存中开辟一个空间,然后将原来的s1指向新的内存空间。

????·字符串池:

????所谓的字符串池就是存放一堆字符串的容器。池里面只会存放常量字符串,不会保存变量字符串,因为字符串的不变性,变量会导致不断地产生新的内存空间,而且只有关闭程序之后才会被释放。

????例如:string name="liqianlong"; 常量字符串

????????string str=a+b; 变量字符串

在这里就可以解释下面的问题:

????为什么 string name="liqianlong";

????????string name1="liqianlong";是同一个对象?

????因为没创建一个字符串对象就会先去"字符串池"里面查找,如果有,那么直接将该内存空间上面的地址赋给该变量。如果没有,就会重新创建内存空间。这样两个字符串对象的内存地址一样,就成为同一个对象。

注意

????string a="a";

????string b="b";

????string c="c";

????string s1=a+b+c;

????和 string s1="a"+"b"+"c";

????这个两个是有区别的,string s1=a+b+c;这句话读取的是a、b、c里面的内容,然后将这三个变量相连接。在此过程中,重新开辟了一个空间,用来存放值,并且不会将值存放到字符串池里面。

????而string s1="a"+"b"+"c";会将a、b、c连接之后,回到字符串池里面查找,如果有就会将"abc"所在的内存空间的地址赋给对应的变量,如果没有,就会重新创建一个内存空间,并且将该常量存放在字符串池里面。

?

3. 怎样将一个变量保存到字符串池里面?

例如:

????使用string.Intern(xx)方法,作用是先判断字符串池里面有没有该字符串,如果有,那么就返回暂存池中它的引用,如果不存在,那么就向暂存池里面添加该字符串。

????使用string.IsInterned()方法,作用是在暂存池中查找该字符串,如果已经将该字符串添加暂存池里面,那么就返回引用,否则返回nullNothingnullptrnull引用。

????????

字符串String类

标签:

原文地址:http://www.cnblogs.com/taidou/p/4677966.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!