16.C# 字符串(String)——《跟老吕学C#》
C# 字符串(String)
一、字符串的声明和初始化
1. 直接赋值
2. 使用`String`构造函数
3. 使用字符串插值(C# 6.0及更高版本)
二、字符串的常用属性和方法
1. 长度
2. 连接字符串
3. 字符串比较
4. 查找子字符串
5. 替换字符串
6. 截取字符串
三、字符串的不变性
四、字符串池(String Interning)
五、 字符串和字符数组
六、字符串的格式化
1. 使用`String.Format`方法
2. 复合格式化
七、字符串和编码
1. 编码字符串为字节数组
2. 从字节数组解码为字符串
八、字符串和正则表达式
1. 使用正则表达式匹配字符串
2. 使用正则表达式替换字符串中的模式
总结
C# 字符串(String)
在C#中,字符串(String)是一种引用类型,用于表示文本数据。字符串是不可变的,这意味着一旦字符串被创建,就不能更改其内容。然而,你可以通过操作字符串来创建新的字符串实例。
一、字符串的声明和初始化
在C#中,你可以使用多种方式来声明和初始化字符串。
1. 直接赋值
string str = "Hello, World!";
1
2. 使用String构造函数
string str = new String('a', 5); // 创建一个包含5个'a'的字符串
1
3. 使用字符串插值(C# 6.0及更高版本)
int year = 2023;
string greeting = $"Hello, it's {year}!"; // 输出:Hello, it's 2023!
1
2
二、字符串的常用属性和方法
1. 长度
你可以使用Length属性来获取字符串的长度(字符数)。
string str = "Hello";
int length = str.Length; // 5
1
2
2. 连接字符串
你可以使用+运算符或Concat方法来连接字符串。
string str1 = "Hello";
string str2 = "World";
string result = str1 + " " + str2; // "Hello World"
string result2 = String.Concat(str1, " ", str2); // "Hello World"
1
2
3
4
3. 字符串比较
C#提供了多种方法来比较字符串,如Equals、Compare和CompareTo。
string strA = "apple";
string strB = "banana";
int comparison = strA.CompareTo(strB); // 小于0,因为"apple"在字典顺序上小于"banana"
1
2
3
4. 查找子字符串
你可以使用IndexOf、LastIndexOf和Contains方法来查找子字符串。
string str = "Hello, World!";
int index = str.IndexOf("World"); // 7
bool contains = str.Contains("World"); // true
1
2
3
5. 替换字符串
使用Replace方法可以在字符串中替换指定的子字符串。
string str = "Hello, World!";
string newStr = str.Replace("World", "C#"); // "Hello, C#!"
1
2
6. 截取字符串
使用Substring方法可以截取字符串的一部分。
string str = "Hello, World!";
string substr = str.Substring(7, 5); // "World"
1
2
三、字符串的不变性
在C#中,字符串具有一个非常重要的特性,那就是不可变性。这一特性意味着一旦一个字符串被创建,它的内容就无法被更改。想象一下,你有一个包含"Hello"的字符串,然后你想要修改它,使其变为"Hello, World!“。在C#中,你不能直接修改这个字符串,因为它是不可变的。相反,当你执行修改操作时,C#会创建一个全新的字符串实例,其内容是"Hello, World!”,而原始的"Hello"字符串则保持不变。
由于这种特性,当我们在处理大量字符串时,需要特别注意内存使用和性能问题。因为每次修改操作都会生成新的字符串实例,这可能会导致内存占用迅速增加,进而影响到程序的性能。
四、字符串池(String Interning)
为了解决字符串不可变性带来的性能问题,C#引入了字符串池的概念。字符串池是一个存储字符串实例的缓存区域,当程序需要频繁使用相同的字符串时,可以从字符串池中直接获取,而不需要每次都创建新的实例。
在C#中,当你使用字符串字面量(例如string str = "Hello";)或调用String.Intern方法时,C#会尝试在字符串池中查找是否存在相同的字符串实例。如果存在,则直接返回该实例的引用,而不是创建一个新的字符串实例。这种机制有助于减少内存使用和提高性能,因为它避免了不必要的字符串实例创建和销毁操作。
五、 字符串和字符数组
在C#中,字符串和字符数组之间有着紧密的联系。你可以使用ToCharArray方法将字符串转换为字符数组,也可以使用new String(char[])构造函数将字符数组转换回字符串。这种转换在处理文本数据时非常有用,因为它允许你以不同的方式访问和操作字符数据。
下面是一个简单的示例代码,展示了如何将字符串转换为字符数组,然后再从字符数组创建新的字符串:
string str = "Hello";
Console.WriteLine("原始字符串: " + str);
char[] charArray = str.ToCharArray();
Console.WriteLine("转换为字符数组: ");
foreach (char c in charArray)
{
Console.Write(c + " ");
}
Console.WriteLine();
string newStr = new String(charArray);
Console.WriteLine("从字符数组创建的新字符串: " + newStr);
1
2
3
4
5
6
7
8
9
10
11
12
13
在这个示例中,我们首先创建了一个包含"Hello"的字符串str。然后,我们使用ToCharArray方法将其转换为字符数组charArray,并使用foreach循环遍历并打印出数组中的每个字符。最后,我们使用new String(charArray)构造函数从字符数组charArray创建了一个新的字符串newStr,并将其打印出来。
六、字符串的格式化
在C#中,字符串的格式化是一种强大的功能,它允许你以特定的格式显示数据。除了前面提到的字符串插值外,你还可以使用String.Format方法和复合格式化功能来格式化字符串。
1. 使用String.Format方法
int number = 12345;
string formatted = String.Format("The number is {0:N0}.", number); // 输出:The number is 12,345.
1
2
在上面的例子中,{0:N0}是一个格式说明符,它表示第一个参数(number)应该被格式化为一个不带小数点的数字,并使用千位分隔符。
2. 复合格式化
复合格式化允许你在同一个字符串中组合多个不同的数据类型,并指定每个数据的格式。
int year = 2023;
double pi = 3.14159;
string message = String.Format("Year: {0}, PI: {1:F2}", year, pi); // 输出:Year: 2023, PI: 3.14
1
2
3
在上面的例子中,{0}表示第一个参数(year),而{1:F2}表示第二个参数(pi)应该被格式化为一个带有两位小数的浮点数。
七、字符串和编码
在计算机中,文本数据通常被转换为二进制数据以进行存储和传输。这个过程称为编码。C#提供了多种编码类(如System.Text.Encoding)来处理字符串和字节之间的转换。
1. 编码字符串为字节数组
string str = "Hello, World!";
byte[] bytes = System.Text.Encoding.UTF8.GetBytes(str); // 使用UTF-8编码将字符串转换为字节数组
1
2
2. 从字节数组解码为字符串
byte[] bytes = { 72, 101, 108, 108, 111, 44, 32, 87, 111, 114, 108, 100, 33 };
string str = System.Text.Encoding.UTF8.GetString(bytes); // 使用UTF-8编码将字节数组解码为字符串
1
2
八、字符串和正则表达式
正则表达式是一种强大的文本处理工具,它允许你使用模式来匹配、查找和替换文本。C#通过System.Text.RegularExpressions命名空间提供了对正则表达式的支持。
1. 使用正则表达式匹配字符串
string input = "Hello123World456";
bool match = System.Text.RegularExpressions.Regex.IsMatch(input, @"\d+"); // 检查输入中是否包含数字,返回true
1
2
2. 使用正则表达式替换字符串中的模式
string input = "Hello123World456";
string result = System.Text.RegularExpressions.Regex.Replace(input, @"\d+", "Number"); // 将数字替换为"Number",输出:HelloNumberWorldNumber
1
2
总结
字符串在C#编程中扮演着重要的角色,无论是用户界面的文本显示,还是数据的存储和处理,都离不开字符串。了解字符串的特性、常用的属性和方法,以及如何处理字符串,对于编写高效、健壮的C#代码至关重要。同时,字符串的不变性和字符串池等概念也是理解C#内存管理和性能优化的关键。
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.youkuaiyun.com/molangmolang/article/details/140070750