黑马程序员--字符串(String) (06)

本文深入讲解C#中字符串的创建、特性及各种操作方法,包括拼接、转换、查找等功能,并对比字符串与StringBuilder的使用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

----------------------ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

一.字符串(String)

  

   1. 创建字符串   

        ① 创建字符串最常用的方式是把一个引号括起来的字符串,称为字符串字面值,例如:

           string meg="Welcome to China.";  

    注意:这种方式创建字符串时,字符串可以包括转义符,如"\n" "\t",都是以反斜线开始。由于反斜线在C#中用作转义字符,所以如果你要在字符串中使用反斜线,而且这个反斜线不是用作转义的时候(如 创建路径 "Mypictures\images"),必须在反斜线前再加一个反斜线。当然除了这种方式以外还有一种方式就是以原样字符串面值创建:以@符号开头来创建字符串。

           例如:string message=@"C:\images\pic.jpg";(这样字符串就是保持了原样,并不会转义)

       创建字符串的另外一种方式是调用对象的ToString()方法,并将结果赋值给一个字符串变量。例如:               

            int  myInteger=4;

            string integerString= myInteger.ToString();

  2. 字符串的特性

       字符串的不可变性: 一旦你在程序中声明了一个字符串,这个字符串的内存是永远都不会改变的,除非它被垃圾回收了。例如;

          

 从结果大家可能就能理解了字符串的不可变性是怎么回事了,这里我再将代码改一下让大家知道到底是怎么回事:

               将第十三行的代码改为: meg1=meg.ToUpper();然后再在控制台中输出meg1,结果就是大家预期的那样meg中的字符都变成了大写。

由于字符串是不可变的,所以每次修改字符串都是创建了一个新的字符串副本(相当于又拷贝了一个字符串),原来的字符串在内存中是不变的。            

      ② 字符串池:如果在程序中声明了有多个相同的字符串常量,那么系统会为这些字符串创建相同的内存(即共用一个内存),以达到节省内存的作用。例如:

         

上面的程序中,定义了一个s1字符串变量和s2字符串变量,两个字符串变量值都是相同的,经过调试,然后用即时窗口观察s1和s2中的值内存地址,发现两个内存地址是一样的,所以说如果在程序中声明了有多个相同的字符串常量,那么系统会为这些字符串创建相同的内存,以达到节省内存的作用。                

   3. 字符串的拼接:字符串的拼接是要用"+",如果两边只要一个是字符串类型,那么另外一个会自动转成字符串类型。

    4. 字符串的一些常用的方法和属性 

      ① Length属性 用来求字符串的长度(或者说字符个数)例如:string meg="kdkf"; int m=meg.Length;

       ②  IsNullOrEmpty()方法 用来判断一个字符串是否为null或者为空字符串。这个方法是一个静态方法,直接用string来调用即可。

注意: string s1=""和sting s2=null的区别

       → string s2=null和string s2 其实这两个是一个意思,都是声明了一个string类型的变量s2,但是并没有赋予一个字符串对象与之相对应,也就是说s2变量并没有指向任何的堆内存。

       → string s1=""和string s1=string .Empty 其实这两个意思是一样,即s1都是指向了一个堆内存,只不过堆内存中保存的是一个空字符串。

      ③ ToCharArray()方法 用作把一个字符串转换成一个char数组,并且可以对数组中的字符进行修改。

例如:  将”hello world”改成”hillo world”
            string s = "hello world";
            char[] chars = s.ToCharArray();//将字符串变成char数组
            chars[1] = 'i'; //字母e所在的位置为1
            s = new string(chars); //得到改变之后的字符数组
            Console.WriteLine(s);

       ④  Equals()方法 用作比较两个字符串是否相同 例如:string s1="AAA";string s2="aaa";

           判断s1和s2是否相同: s1.Equals(s2);如果是相同返回true;反之为false;

注意:可以通过 字符串1.Equals(字符串2, StringComparison.OrdinalIgnoreCase))来操作 从而忽略大小写问题。例如:

                 string s1 = "AaA";

                string x = "aAa";

                if (s1.Equals(x, StringComparison.OrdinalIgnoreCase) == true)

                {

                    Console.WriteLine("相同");

                }

                else

                    Console.WriteLine("不同");

                结果输出为相同

                     ⑤  ToUpper()方法 将字符串中所有的字母都转换成大写 

           ToLower()方法将字符串中所有的字母都转换成小写

           

       ⑥  IndexOf()方法这个方法有很多重载的方法,这里只讲两种常见的方法:

           int IndexOf(string value) :得到字符串中value第一出现的索引,如果没有找到相应的则返回-1

           int IndexOf(string value,int StartIndex):取出从StartIndex位置开始寻找value第一次出现的索引,如果没有找到则返回的值为-1.

例如:

                         

       ⑦ LastIndexOf()方法 这个方法也有很多重载方法 这里只说一种:

          int LastIndexOf(string value): 得到字符串中value最后一次出现的索引

          注:其它重载方法和IndexOf()方法差不多。

       ⑧ Substring()方法用来截取字符串  这里介绍两种重载方法

         string Substring(int StartIndex) 从StartIndex位置开始截取字符串(包含StartIndex位置的字符),一直截取到最后。

         string Substring(int StartIndex,int length) StartIndex位置开始截取字符串而且只截取length个字符。

例如:

         string str = "My Names is";

          string result = str.Substring(6);

          //因为数组的下标是从0开始的,而Names中的s是第7个元素,它的下标为6

          Console.WriteLine(result);

          //此处结果为输出es is   

          string result2 = str.Substring(6, 2);

          //从下标位置为6的地方开始截取,长

          Console.WriteLine(result2);

             //结果为 es

      ⑨ Split()方法 可以根据指定的字符将整个字符串分割

     →将字符串按照指定的字符分割:string[] Split(params char[] separtator)(注:有params 修饰的数组,可以直接传元素)

      例如:  string str = "hello,,,,world,,...";

              //将字符串按照,.分割,Split方法把分割后的结果作为数组返回

              string[] words = str.Split(',', '.'); 

              for(int i=0;i<words.Length;i++) //words.Length是分割之后的words数组长度

              {

                  Console.Write(words[i]);

              }

     输出结果为;hello   world(hello和world中间有3个空格)

 

    ⑩ Replace(m,n)方法  将m中的内容替换成n(其中m,n必须同是字符串或者是字符)

例如:

           将2013/12/12输出为2011-12-12

            string date = "2011/07/05";

            date = date.Replace('/', '-');

            Console.WriteLine(date);


5. StringBuilder对象


  ①  因为字符串具有不可变性,所以当多个字符串进行拼接或者累加时,会产生很多垃圾内存,这样会让性能极具下降,这样我们就引入了StringBuilder对象来解决这个问题。例如在一个循环中将许多字符串连接在一起时,可以使用StringBuilder类来提升性能

 ② 与String不同的是,StringBuilder是可变的,也就是说,修改时改的是实际原字符串,而不是副本。

  ③  StringBuilder对象仅仅是拼接字符串的工具,大多数情况下还是需要把StringBuilder转换为String

 ④ StringBuilder类还是提供了许多方法,比如Append()方法 Insert()方法 Remove()方法等






---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值