在上个篇章中,我们主要介绍了较为常见的几种值类型的数据类型,在本章节中,将会为大家介绍第一个引用类型的数据类型,字符串,让我们不用再受到char类型变量只能存放一个字符当结巴,真正的可以在程序中“流畅的说出一句话”。
字符串是零个或多个字符并列排列在一起的字符,放置在一个双引号中,用于将多个字符拼接在一起,表达出一整个语句。
和char类型最大的区别在于,char类型只能用于存储单一的一个字符,而字符串可以存储任意长度的字符,也因此,字符串占用的字节数是不固定的,会根据存储的字符个数动态改变。
和char类型不同,字符串属于引用类型的数据类型,也是我们涉及到的第一个引用类型的数据类型,引用类型和值类型最大的区别在于,值类型变量对应的就直接是一个具体的数值,而引用类型对应的则是一段内存地址。
产生这种区别的原因就在于引用类型大小不确定,而且有可能很大,如果把一个字符比喻成一瓶可乐的话,我们要把可乐放在桌面上,一瓶可乐,我们可以确定它的大小,在桌子上找出一片可以放下这瓶可乐的地方,也许两瓶也可以,所以我们可以直接找到一片空间来存储这个字符。但如果我有一箱可乐呢?又或者更多,可能我太爱喝可乐了,我一次会买10-1000箱不等的可乐,我还能确定的从我的桌面上清理出一片空间用来放置这些可乐么?显而易见,我已经没办法预测这些可乐会占多少地方了。那我们该怎么办呢?
其实很简单,就像许多产品的经销商一样,我们可以找一片很大的空地,当我买了一定的可乐后,就根据可乐的数量,在这个空地上建造一个专属于它的仓库,而我只需要知道这个仓库的地址在哪里就可以了,当我再想喝可乐时只需要根据地址找到这片仓库就可以了。
引用类型就是这样的,引用类型变量存储的并不是这一仓库的可乐,而仅仅是存放这堆可乐的仓库的地址,而引用类型和值类型更多的区别我们也会在后续的文章中逐渐介绍。
如上文中提及的,和字符类型的定义不同,字符串的所有字符需要放在一个双引号中。
//“Hello World”表示的是一个字符串
//'H'表示的是一个字符
而定义一个字符串变量所需要使用的关键字是"string",我们可以用很多方法声明并初始化一个字符串,如下:
//仅仅定义一个字符串变量,并不进行初始化
string message1;
//定义一个字符串变量,初始化赋值为null
//null为一种特殊的取值,表示引用类型为空,没有给定具体值
string message2 = null;
//定义一个字符串变量,初始化赋值为空字符串,与直接赋值为""一样
string message3 = string.Empty;
string message4 = "";
//定义一个字符串变量,初始化赋值为“Hello World”
string message4 = "Hello World";
在如上的几种定义方式中,最独特的就是第一种,第一种方式定义的字符串仅仅只有一个变量,并没有任何内涵,所以如果没有额外进行任何赋值操作的直接使用,在编译时系统将会报错。
string message1;
Console.WriteLine(message1);//程序报错,信息为使用了未赋值的局部变量“message1”
在程序编写时,我们经常会遇到一些问题,比如在写文章时,我们经常会需要引用一些其他人说的话,或者写一些专有名词,这种时候我们通常需要使用双引号将要引用的文字或专有名词进行标记,但在程序中,如果在字符串中要写出双引号,就会出现一些问题,如:
string message = "他说:"你好世界"";
如上的写法在程序中将会出现错误,程序无法识别字符串中的双引号是表示新的字符串还是要输出的字符,因此这样的写法会被认为是写了两个字符串,因而程序产生错误。
那么我们在程序中遇到这种情况时,一般是将需要引用的地方用单引号来引用。
string message = "他说:'你好世界'";//输出结果为:他说:'你好世界'
那么假如说就希望它输出双引号的话该怎么做呢?
我们可以使用这种做法。
string message = "他说:\"你好世界\" ";//输出结果为:他说:"你好世界"
这里出现了一个特殊的形式,在双引号的前面加上一个反斜杠“\”,这种一个反斜杠加上一个字符的形式,被称为转义字符,是一种在字符串中使用的特殊标记,在上面的代码中,使用“ " ”这个符号来表示一个双引号,以避免双引号之间的冲突。
常用的转义字符还有“\n”换行符,这个转义字符将会让字符串在这里换行显示。
//输出结果为:
//他说:"你好
//世界"
string message = "他说:\"你好\n世界\" ";
以下列举了一些转义字符
字符 | 字符名称 |
---|---|
\’ | 一个单引号 |
\" | 一个双引号 |
\\ | 一个反斜杠 |
\b | 退格 |
\f | 换页 |
\n | 换行 |
\r | 回车 |
\t | 水平制表符 |
\v | 垂直制表符 |
在程序中还有一种特殊的情况,我们会需要取消转义字符对我们的影响,比如当我们需要用字符串存储下我的个人主页网址。
//报错:无法识别的转义序列
string message = "https:\\blog.csdn.net\qq_41603300?spm=1000.2115.3001.5343";
上面的语句就会出现报错,因为第二个反斜杠那里的“ \q ”会被系统识别为转义字符,但事实上并没有这个转义字符,因而产生了报错。
那么我们改如何解决呢?
//输出结果为:https:\\blog.csdn.net\qq_41603300?spm=1000.2115.3001.5343
string message = "https:\\\\blog.csdn.net\\qq_41603300?spm=1000.2115.3001.5343";
在转义字符中,“\”表示输出一个反斜杠,在这里这样的方法就可以正常的输出,但很显然这种写法会非常的麻烦,而且如果输入的时候出现了一些马虎,很容易导致程序出错,所以是否有别的办法解决这个问题呢?
//输出结果为:https:\\blog.csdn.net\qq_41603300?spm=1000.2115.3001.5343
string message = @"https:\\blog.csdn.net\qq_41603300?spm=1000.2115.3001.5343";
在双引号前加上一个“@”符号,表示转义字符失效,这个符号的作用为将后面双引号内的字符串中所有的转义字符失效,来避免转义字符对我们的影响
在字符串操作中,我们有时候需要将两个字符串进行拼接,如:
string message1 = "你好";
string message2 = "世界";
//输出结果为:你好世界
Console.WriteLine(message1 + message2);
在字符串运算中,“+”这个运算符不再是将两个值相加,而是将两个字符串拼接成一个,把加号后面的字符串内容直接拼在前一个字符串末尾。
在项目中我们需要的字符串往往会比较复杂,比如我需要输出一句“小明和小强打架,小明打了小强一拳,小强灵活走位闪开了,顺便还了小明一脚,并说了一句:几天不见,小明怎么这么菜了?”。
那么在程序中我们需要这么写:
Console.WriteLine(“小明和小强打架,小明打了小强一拳,小强灵活走位闪开了,顺便还了小明一脚,并说了一句:几天不见,小明怎么这么菜了?”);
那么假如现在,打架的两个主角不再是小明和小强了,而是张三和李四,我们需要怎么办,在字符串中把所有的小明小强全部替换掉。
但如果打架的两个人名字不确定,比如在游戏中两个玩家pk,我们无法在写代码的时候就确定他们的名字,怎么办呢?
当然,我们可以使用变量,那么这个项目会改为:
string player1 = “小明”;
string player2 = “小强”;
Console.WriteLine(player1 + "和" + player2 + "打架," + player1 + "打了" + player2 + "一拳," + player2 + "灵活走位闪开了,顺便还了" + player1 + "一脚,并说了一句:几天不见," + player1 + "怎么这么菜了?”);
大家可以自己在VS中写一遍试试,很明显这种写法很麻烦,我们需要写太多的字符串拼接了,而且总是player1和player2两个变量来回使用,万一马虎很可能导致输出结果出问题,那我们怎么简化这个过程呢?
string player1 = “小明”;
string player2 = “小强”;
Console.WriteLine(“{0}和{1}打架,{0}打了{1}一拳,{1}灵活走位闪开了,顺便还了{0}一脚,并说了一句:几天不见,{0}怎么这么菜了?”, player1, player2);
上面的做法,在字符串中的{0}和{1},我们称之为占位符,就像排队买东西一样,比如当店铺还没开门,我们需要在店外排队,但是顶着炎炎烈日排队显然不是什么明智之举,所以我们可以留下一个属于自己的东西占着位置,比如放一个小板凳,在上面放上自己的衣服或者鞋子什么的,当开门的时候,再回到我们之前占的位置就可以了。
其实在程序中的占位符也是一样的,我们可以在字符串中写下大括号中加一个数字的形式,表示这个位置被人占了,当输出时会输出占住这个位置的字符串的内容,当然,这里的数字对应着后面的变量,0表示字符串后面的第一个变量,1表示第二个,以此类推。
今天我们主要是介绍了字符串这种引用类型的数据类型,它的本质其实就是将多个字符拼接在一起,成为一整个句子的形式,另外,我们也介绍了字符串中较为常用的一些转义字符,以及如何让转义字符失效的方法。