请参考:http://msdn.microsoft.com/zh-cn/library/ms228362.aspx
一般编程离不开字符串处理,此处加强和巩固下基础知识。
不可变、字符串池、(很少用)字符串留用(string.Intern()指针变量常量)
字符串对象是不可变的:即它们创建之后就无法更改。 所有看似修改字符串的 String 方法和 C# 运算符实际上都以新字符串对象的形式返回结果。
当程序有多个相同的字符串常量时,这时,这些字符串都是指向内存中的同一个字符串,这个特性叫做:字符串池。之所以字符串池不会造成程序混乱,是因为字符串有不可变性。例如:声明两个字符串变量,变量内容一模一样,然后查看堆地址,会发现地址是一样的。
String.Intern(String str)用来检索系统对指定 String 的引用:在暂存池中检索字符串,如果存在了str则返回系统对其的引用,否则返回对值为str的字符串的新引用。Ps:可以用于字符比较大的引用。
使用 Empty 常量值初始化字符串可新建字符串长度为零的 String 对象。 零长度字符串的字符串表示形式为 ""。 使用 Empty 值(而不是 null)初始化字符串可以降低发生 NullReferenceException 的可能性。 请在尝试访问字符串之前使用静态 IsNullOrEmpty(String) 方法验证字符串的值。
Null字符串和空字符串:空字符串是不包含字符的 System.String 对象的实例。 在各种编程方案中经常会使用空字符串表示空白文本字段。 可以对空字符串调用方法,因为它们是有效的 System.String 对象。null 字符串并不引用 System.String 对象的实例,任何对 null 字符串调用方法的尝试都会生成 NullReferenceException。
小结:简单的说null表示没有指向任何堆内存。String.Empty和””表示指向一个堆内存,这个堆中存储的是”空字符串”。String.Empty和””在堆中是一样的。
判读字符串为空是可以使用使用静态 IsNullOrEmpty(String) 方法验证字符串的值。还可以使用string.Length属性。删除字符串可以Delete、null、Length属性等等。
判断字符串是否相等可以用==、Equals()、还可以使用object.ReferenceEquals()等等。其实==只是一个运算符重载而已,其实内部也是调用Equals()方法。object.ReferenceEquals()不能被重载。
若要串联字符串变量,可以使用 + 或 += 运算符,也可以使用 String.Concat、String.Format 或 StringBuilder.Append 方法。 + 运算符容易使用,且有利于提高代码的直观性。 即使在一条语句中使用多个 + 运算符,字符串内容也将只复制一次。 但是,如果重复此操作多次(如使用循环),则可能会导致出现效率问题。
如果您串联的字符串数量不那么巨大(例如,在循环中),那么这些代码的性能成本可能不会很高,此时用+或String.Concat和String.Format方法。
.NET 中的字符串操作已高度优化,大多数情况下不会显著影响性能。 但在某些应用场景中,例如在执行好几百甚至好几千次的紧凑循环中,字符串操作会影响性能。 StringBuilder 类创建了一个字符串缓冲区,用于在程序执行大量字符串操作时提供更好的性能。 StringBuilder 字符串还使您能够重新分配个别字符(内置字符串数据类型所不支持的字符)。
如果性能的优劣很重要,则应该总是使用 StringBuilder 类来串联字符串。System.Text.StringBuilder 类提供一个可“就地”修改的字符缓冲区。调用 StringBuilder.ToString 方法可新建包含此缓冲区的当前内容的字符串对象。
子字符串是包含在字符串中的任意字符序列。 使用 Substring 方法可以基于原始字符串的一部分创建新字符串。 可以使用 IndexOf 方法搜索子字符串的一个或多个匹配项。 使用 Replace 方法可将指定子字符串的所有匹配项替换为一个新字符串。 与 Substring 方法一样,Replace 实际上返回的也是新字符串,而不修改原始字符串。
编译时,原义字符串转换为所有转义序列均保持不变的普通字符串。 因而,如果在调试器监视窗口中查看原义字符串,则看到的将是编译器添加的转义字符,而不是源代码中的原义版本。 例如,原义字符串 @"C:\files.txt" 在监视窗口中将显示为 "C:\\files.txt"。
如果是路径问题的话请使用Path类里面关于路径拼接的方法。
字符串是 String 类型的对象,它的值是文本。 在内部,文本被存储为 Char 对象的顺序只读集合。 C# 字符串末尾没有以 null 结尾的字符;因此 C# 字符串可以包含任意数目的嵌入式 null 字符(“\0”)。 字符串的 Length 属性代表它包含的 Char 对象的数量,而不是 Unicode 字符的数量。 若要访问字符串中的各个 Unicode 码位,请使用 StringInfo 对象。
若要使用数组表示法访问字符串中的各个字符,可以使用 StringBuilder 对象,该对象重载 [] 运算符以提供对其内部字符缓冲区的访问。 也可以使用 ToCharArray 方法将该字符串转换为一个字符数组。 下面的示例使用 ToCharArray 创建该数组。 然后修改该数组中的某些元素。 之后再调用采用一个字符数组作为输入参数的字符串构造函数来创建一个新字符串。
//以前编程时忘了总结了。下次遇到再补上。
//微软的例子,英文看不懂的话可以用有道
// Date strings are interpreted according to the current culture.
// If the culture is en-US, this is interpreted as "January 8, 2008",
// but if the user's computer is fr-FR, this is interpreted as "August 1, 2008"
string date = "01/08/2008";
DateTime dt = Convert.ToDateTime(date);
Console.WriteLine("Year: {0}, Month: {1}, Day: {2}", dt.Year, dt.Month, dt.Day);
// Specify exactly how to interpret the string.
IFormatProvider culture = new System.Globalization.CultureInfo("fr-FR", true);
// Alternate choice: If the string has been input by an end user, you might
// want to format it according to the current culture:
// IFormatProvider culture = System.Threading.Thread.CurrentThread.CurrentCulture;
DateTime dt2 = DateTime.Parse(date, culture, System.Globalization.DateTimeStyles.AssumeLocal);
Console.WriteLine("Year: {0}, Month: {1}, Day {2}", dt2.Year, dt2.Month, dt2.Day);
/* Output (assuming first culture is en-US and second is fr-FR):
Year: 2008, Month: 1, Day: 8
Year: 2008, Month: 8, Day 1
*/
由于string类型重写了从object类中继承下来的Equals方法,是怎么重写的呢?
只要两个字符串中的字符完全相同就返回true或者两个字符串是同一个对象也返回true。Equals方法子类可以重写,所以通过Equals方法判断是否是同一个对象不靠谱,所以判断两个对象是否是同一个对象用:object.ReferenceEquals()。
除了在使用字符数组初始化字符串时以外,不要使用 new 运算符创建字符串对象。