






















字符串表现信息的能力非常强大。对于String,C#提供了很多基本方法,并且对其进行了优化,下面介绍下一些基础知识,可作为参考。
1. 常用方法
2. 不可变性
字符串是不可变的,也就是说,无论你对一个字符串做任何操作(增加字符、删除字符。。。),都不会改变它的值。问题是,我们不能改变它的值怎么操作字符串呢?解决方法就是创建一个新的字符串,把操作结果赋值给这个新的字符串。
3. 字符串池
由于经常用到字符串,难免出现大量重复的值。想要优化这种浪费内存的做法就是:建立一个池,把所有出现过的字符串都放在这里供程序使用。如果都是读取,无论从空间还是时间角度来看,那肯定大量提高性能。那如果修改呢?大家共享一个资源,通常情况下会造成多线程冲突。这里就有个nb的特性起作用了,就是字符串的不可变性。它不可变,就不存在操作冲突的情况了!!
4. 空间性能考虑
每次修改一个字符串都会产生新的string对象,可能会造成字符串对象大量产生带来的性能下降。比如,一万个a叠加的程序:
string result = "";
for (int i = 0; i < 10000; i++)
{
result += "a";
}
这段程序会产生1+2+3+…..+10000个字符串对象,“a”“aa”“aaa”aaaa“。。。。
对于这种性能的问题,解决的方式是使用StringBuilder。它对内部字符数据做修改,而不是产生数据副本,所以会节省大量空间。
StringBuilder result = new StringBuilder();
for (int i = 0; i < 10000; i++)
{
result.Append("a");
}
通过ToString()方法,你可以得到10000个a长度的结果,最终只会产生2个对象,大大节省了内存空间。
5. 字符串拼接
通过“+”,可以直接拼接多个字符串。其实是重载了操作符,底层调用了String.Concat()方法。无论如何,这样的拼接会产生多个字符串结果。通过使用StringBuilder的Append方法来解决一般拼接造成的性能问题。
6. 转义字符“\”
7. 逐字字符串“@”
可以是字符串中的转义字符实效,尝尝用在网络地址或者本地文件系统路径中。
8. 相等性
String重载了“==”操作符已经被重载,所以String的“==”并不是真的比较reference是否相等,而是比较了值,这和Equals方法一样。另外,一般来说,字面值一样的字符串,它们引用的都是字符串池中的对象实例,所以reference也是一样的。只有在使用new关键字创建一个String对象时,才会在托管堆上建立实例,拥有不用的reference,也就是用new关键字脱离了string池机制的范畴。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。