字符串是值为文本的 String 类型对象。 文本在内部存储为 Char 对象的依序只读集合。 在 C# 字符串末尾没有 null 终止字符;因此,一个 C# 字符串可以包含任何数量的嵌入的 null 字符 ('\0')。 字符串的 Length 属性表示其包含的 Char 对象数量,而非 Unicode 字符数。 若要访问字符串中的各个 Unicode 码位,请使用 StringInfo 对象。
string 与System.String
在 C# 中,string 关键字是 String 的别名。 因此,String 和 string 是等效的(虽然建议使用提供的别名 string),因为即使不使用 using System;,它也能正常工作。 String 类提供了安全创建、操作和比较字符串的多种方法。 此外,C# 语言重载了部分运算符,以简化常见字符串操作。
声明和初始化字符串
可以使用各种方法声明和初始化字符串,如以下示例中所示:
// Declare without initializing.
string message1;// Initialize to null.
string message2 = null;// Initialize as an empty string.
// Use the Empty constant instead of the literal "".
string message3 = System.String.Empty;// Initialize with a regular string literal.
string oldPath = "c:\\Program Files\\Microsoft Visual Studio 8.0";// Initialize with a verbatim string literal.
string newPath = @"c:\Program Files\Microsoft Visual Studio 9.0";// Use System.String if you prefer.
System.String greeting = "Hello World!";// In local variables (i.e. within a method body)
// you can use implicit typing.
var temp = "I'm still a strongly-typed System.String!";// Use a const string to prevent 'message4' from
// being used to store another string value.
const string message4 = "You can't get rid of me!";// Use the String constructor only when creating
// a string from a char*, char[], or sbyte*. See
// System.String documentation for details.
char[] letters = { 'A', 'B', 'C' };
string alphabet = new string(letters);
不要使用 new 运算符创建字符串对象,除非使用字符数组初始化字符串。
使用 Empty 常量值初始化字符串,以新建字符串长度为零的 String 对象。 长度为零的字符串文本表示法是“”。 通过使用 Empty 值(而不是 null)初始化字符串,可以减少 NullReferenceException 发生的可能性。 尝试访问字符串前,先使用静态 IsNullOrEmpty(String) 方法验证字符串的值。
字符串的不可变性
字符串对象是“不可变的”:它们在创建后无法更改。 看起来是在修改字符串的所有 String 方法和 C# 运算符实际上都是在新的字符串对象中返回结果。 在下面的示例中,当 s1 和 s2 的内容被串联在一起以形成单个字符串时,两个原始字符串没有被修改。 += 运算符创建一个新的字符串,其中包含组合的内容。 这个新对象被分配给变量 s1,而分配给 s1 的原始对象被释放,以供垃圾回收,因为没有任何其他变量包含对它的引用。
string s1 = "A string is more ";
string s2 = "than the sum of its chars.";// Concatenate s1 and s2. This actually creates a new
// string object and stores it in s1, releasing the
// reference to the original object.
s1 += s2;System.Console.WriteLine(s1);
// Output: A string is more than the sum of its chars.
由于字符串“modification”实际上是一个新创建的字符串,因此,必须在创建对字符串的引用时使用警告。 如果创建了字符串的引用,然后“修改”了原始字符串,则该引用将继续指向原始对象,而非指向修改字符串时所创建的新对象。 以下代码阐释了此行为:
string str1 = "Hello ";
string str2 = str1;
str1 += "World";System.Console.WriteLine(str2);
//Output: Hello