基本操作

Object. ToString 方法

对于 C#的任意一个对象都有一个继承自 Object 的 ToString 方法,这个方法没有额外参数,返回一个字符串,在没有进行重写的前提下,该方法返回的是类全名(所谓类全名就是 命名空间.类名 的表示)。

这个方法贯穿着整个 C#的字符串功能逻辑,这个方法也是用来获取一个对象的文字描述的方法。

字符串的“加法”运算

例如:

1
2
3
string str1 = 1 + "123"; // 1123
string str2 = 2.3 + "123"; //2.3123

如上述示例中描述的,类似于 ‘对象’+‘字符串’ 的形式,我把它成为‘加法’运算。

为什么叫‘加法’运算?

其实在官方并没有对这种声明方式做出明确定义,规定其命名方式。我之所以称之为‘加法’运算是因为这种方式跟数值的加法运算有很多相似的地方,比如说优先级的问题。

示例:

1
2
3
string str1 = 1 + "1" + 123; // 11123
string str2 = 1 + 1 + "123"; // 2123
string str3 = "1" + 1 + 123; // 11123

以上三个示例,如果按照字符串连接来理解会很麻烦,比如说为什么 str2 里的 1+1 会先运算,为什么 str3 不是 1124 等。如果按照加法来理解,就很好理解了。 str2 先计算 1+1 =2,然后又计算 2 +"123" ;str3 先计算 "1"+1 = “11”再计算 "11"+123

简单来讲就是,在 C#中,字符串的‘加法’运算会按照正常数字的加法运算顺序进行运算。如果遇到对象+字符串的计算,则调用对象的 ToString 方法获取对象的字符串描述,再将这个描述与字符串进行连接。

字符串的格式化

string.Format 方法 C#提供了很多个重载版本,这里只简单介绍一下常用的一种写法:

1
2
string str = string. Format("{0}-{1}", 1, 2); //1-2

这个方法的参数列表可以参照:

1
public static string Format(string format,params object[] objs);   //params 关键字表示可变参数列表,后面跟一个数组的声明,表示这个参数可以是任意个,方法内按数组使用

format 参数是一个格式化字符串,其中 {} 包裹一个数字为占位符,表示后面的 objs 参数里第几个参数替换到这个位置。

C#在后续的版本更新中为字符串的格式化增加了一种写法:

1
2
3
4
int a = 10; 
double b = 10.3;
string str = $"{a}{b}";

该写法为在字符串的双引号之前使用美元符号$开始,然后用{}包裹变量名,表示变量名替换到对应的位置。这种写法简单明了,而且不用担心占位符的数字写错导致报错。objs 的数量大于 5 个,format 的内容一旦过长很容易出现占位符数字编号标错的问题。

有一个问题,如果字符串本身包含{}呢?解决方法很简单:在大括号外面再加一个相同的大括号就可以了

这里简单的介绍一下字符串格式化另一个重要的内容,数据的格式化。用法就是在大括号包裹的占位符的后面加:<format表达式>,在数字或变量后面加冒号然后写格式化表达式。

数字的字符串格式化

1
string.Format("{0:#0.00}-{1}", 1, 2); // #0.00表示生成一个 带两位小数的数字字符串,不足两位用0补齐

日期的字符串格式化

1
2
3
DateTime date = DateTime. Now; 
string str = $"{date:yyyy-MM-dd}"; // 2020-04-15

字符串的查找

是否是某个字符串开头或结尾

1
2
public bool StartsWith(string value);
public bool EndsWith(string value);

返回字符串的开头或末尾是否与 value 一致。

示例:

1
2
3
4
var str = "woaigefengzhen"; 
str. StartsWith("1"); // false
str. StartsWith("wo"); // true

是否包含某个字符串

1
public bool Contains(string value);

检测源字符串中是否包含一个子串,这个子串与 value 相等。

找位置

1
2
3
4
5
public int IndexOf(char value); //查找字符 value 在字符串中第一次出现的位置
public int IndexOf(char value, int startIndex); //查找字符串中字符 value在 startIndex之后 第一次出现的位置
public int IndexOf(string value); //查找子串 value 在字符串中第一次出现的位置
public int IndexOf(string value, int startIndex); //查找字符串中子串value在startIndex之后第一次出现的位置

以上方法还有一个相似的方法LastIndexOf,顾名思义,返回最后一次出现的位置,参数与以上方法一致。

值得注意的是,所有的下标或索引都是从 0 开始计算位置,如果没有找到则返回 -1。

修改、分解字符串

替换内容

1
2
public string Replace(string oldValue, string newValue);
public string Replace(char oldValue, char newValue);

将字符串中的oldValue替换成newValue,如果字符串中不包含oldValue,则字符串不发生任何改变。

对字符串掐头去尾

头尾一起操作:

1
2
3
4
public string Trim(); // 去掉字符串头和尾的空格
public string Trim(char trimChar); //去除字符串头和尾的 字符 trimChar
public string Trim(params char[] trimChars); // 从字符串的头和尾中去除 trimChars包含的所有字符

只操作头的话用TrimStart,只操作尾用TrimEnd

例如:

1
2
string a="(1, 2, 3)";
a.Trim('(', ')') //返回"1, 2, 3";

这里有一个问题,对字符串的掐头去尾不能处理子串,都是以字符的形式进行处理的。尤其是参数 params char[] trimChars 的处理,需要格外注意。

大小写切换

1
2
3
public string ToLower(); // 转换为小写字母
public string ToUpper(); // 转换为大写字母

我们通常说的大小写转换是指英文字符的大小写转换,其他语言的大小写转换与对应语言设置有关。中文和数字不会发生变化,尤其是中文不会繁体化或简体化(这个微软要是真做出来就牛逼了)。

分解字符串

1
2
public string[] Split(char separator, StringSplitOptions options = StringSplitOptions.None);
public string[] Split(string separator, StringSplitOptions options = StringSplitOptions.None);

以上两个方法都会将字符串分解成一个字符串数组,其中分隔符就是 separator

获取一个子串

1
2
public string Substring (int startIndex); // 返回从startIndex开始,剩下的的元素,包括startIndex
public string Substring (int startIndex, int count); // 返回从startIndex开始,一共count个元素的字符串,包括startIndex