字符串String类

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引用。

        

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