C#学习笔记--字符串类的小结

字符串String 类是密封的,被sealed修饰,具有不可变性,还有字符串池。

1、不可变性

   当一个字符串被声明和赋值的时候,其变量指向的地址在堆中的地址内容是不可变的,只有在程序结束时,才能被释放,当然可以通过StringBuilder对字符串进行操作。

//以下操作相当于在堆中开辟五块内存地址
//"a""b""c"在堆中的地址如何没有相应的栈内存指向,会一直保存在堆中,知道程序关闭释放
string a="a";
string b="b";
string c="c";
a=a+b;//结果:ab
a=a+c;//结果abc

2.字符池 

//s1和s2可以说是两个相同的对象,它们在栈中的地址不一样,但是都指向的是"abc"堆中的地址
//s1和s3不是同一个对象,s3的赋值语句a+b+c相当于在堆中重新开辟了一块内存
string s1="abc";
string s2="abc";
string a="a";
string b="b";
string c="c";
string s3=a+b+c;

   在声明一个字符串变量并赋值的过程中,会先对赋值的内容在字符池中查找,如果存在,则直接把变量质量这块内存地址,如果不存在则重新开辟一块内存地址存储赋值的内容 

对于动态字符串本身在哈希表中没有,通过这种Intern可以添加到该哈希表中,目的为了提高性能。
(1)StringIntern(xx),Intern 方法使用暂存池来搜索与str值相等的字符串。如果存在这样的字符串,则返回暂存池中它的引用。如果不存在,则问暂存池添加对str的引用,然后返回该引用。
(2)Sstring Isintemed(xx),此方法在暂存池中查我str。如果已经将str放入暂存池中,则返回对此实例的引用;否则返回 nullNothingnullptrnu引用

3、为什么要在字符串类前加sealed关键字修饰?

(1)子类如果要继承字字符串类,可能会对字符串类进行修改,对字符串的特性可能会改变(改变字符串的不可变性)

(2)CLR对字符串提供 各种特殊的操作方式,如果有很的子类对字符串类继承,CLR需要对更多类型提供特殊的操作,会降低性能。

4.字符串格式化

在Console.WriteLine()和string.Format()可能都需要对字符串进行格式化操作

如string.Format("今天是{0},我赚了{1}",System.DateTime.Now,800)

对字符串操作:string.Format("今天是{0:D},我赚了{1:C3}",System.DateTime.Now,800)

{0,20]表示向右对齐,有20个空格的宽度

{0,-20}表示向左对齐,有20个 空格的宽度

{变量序号,宽度:字符格式},具体操作查看微软msdn:复合格式

猜你喜欢

转载自blog.csdn.net/qq_39157152/article/details/106972424