3月28日 字符串
字符串是什么
简单说:字符串就是一串字符。比如:
hello world // 一串英文是字符串
大漠沙如雪,燕山月似钩。 // 一串中文是字符串
123456 // 一串数字也可以是字符串
但是,在程序中,为了让编译器能够识别出这是字符串,C#语法强制规定:所有字符串必须使用双引号包裹。
字符串是使用双引号包括的不可变的有序字符序列。
字符串的特点
- 必须使用双引号包裹
- 固定性:字符串一旦创建,不可改变。所有修改字符串的操作(拼接、替换、截取)都会生成新字符串。
- 有序性:字符串是有序的排列的,这意味着字符串中的每个字符都有它的编号,这个编号称之为。
- 引用类型
string s = "a";
s += "b"; // 不是修改原字符串,而是创建新字符串 "ab"
声明与初始化字符串
声明字符串是指只声明字符串变量,不赋值。
string str1;
string str2; // 也可以先声明,后赋值
str2 = "Hello World"; // 但是这样写稍显啰嗦,推荐声明字符串的同时初始化。
初始化字符串指声明字符串变量的同时,赋予初始值。
// 普通字符串
string str3 = "hello world";
声明空字符串
// 空字符串
string s1 = ""; // 在内存中创建了一个字符串对象,内容为空,长度是 0
// null
string s3 = null; // null不指向任何对象(空引用)
三、常用方法(高频)
1. 获取信息
str.Length; // 长度
str.Contains("abc");// 是否包含
str.StartsWith("a");// 是否以...开头
str.EndsWith("z"); // 是否以...结尾
str.IndexOf("b"); // 第一次出现的索引,找不到返回 -1
str.LastIndexOf("b");// 最后一次出现的索引
2. 修改/处理字符串
str.ToUpper(); // 转大写
str.ToLower(); // 转小写
str.Trim(); // 去掉首尾空格
str.Substring(2); // 从索引2开始截取到末尾
str.Substring(2,3); // 从索引2开始,取3个字符
str.Replace("a","b");// 替换所有a为b
3. 分割与合并
// 分割
string[] arr = "a,b,c".Split(',');
// 合并
string s = string.Join("-", arr); // "a-b-c"
4. 判断空/空值
// 最常用
string.IsNullOrEmpty(str); // null 或 ""
string.IsNullOrWhiteSpace(str);// null、空、全是空格
四、字符串拼接
- + 号(简单场景)
- $ 字符串插值(推荐,最清晰)
string name = "tom";
string s = $"姓名:{name}"; - StringBuilder(大量拼接时必须用,性能极高)
StringBuilder sb = new StringBuilder();
sb.Append("a");
sb.Append("b");
string res = sb.ToString();
五、字符串比较
// 相等
str1 == str2
// 不区分大小写比较
string.Equals(str1, str2, StringComparison.OrdinalIgnoreCase);
六、字符串与其他类型转换
// 数字 → 字符串
num.ToString();
// 字符串 → 数字(推荐用 TryParse,不报错)
int.TryParse(str, out int n);
七、重点面试题
-
string 是值类型还是引用类型? 引用类型,但有值类型的行为。
-
字符串为什么不可变? 安全、线程安全、哈希值稳定、字符串池优化。
-
string.Empty 和 "" 和 null 的区别?
""和string.Empty一样,是空字符串null是没有指向对象
-
大量拼接字符串为什么要用 StringBuilder? 因为 string 不可变,拼接会产生大量垃圾对象,StringBuilder 直接修改内存,性能高。
总结(最核心 4 句话)
- string 是引用类型、不可变
- 常用方法:
Length、Contains、Substring、Replace、Trim、Split - 拼接优先用 $插值,大量拼接用 StringBuilder
- 判断空用
string.IsNullOrEmpty/IsNullOrWhiteSpace
需要我给你出一套 C# 字符串练习题 巩固一下吗?