C# 数据类型之 String(字符串)

?  前言

在开发中最常见的数据类型就是 String 类型,即字符串类型。为什么要单独讨论下这个类型,是因为:它是系统内置的基础数据类型;它的使用频率非常高;它是一个特殊的引用类型。其实大家都会使用它,但可能或多或少了解不够全面,本文主要是抱着:学习、巩固、总结的目的去加深对它的了解,主要学习一下几点:

1.   什么是 string 类型

2.   创建 string 对象的方式

3.   String 的常用静态方法

4.   string 的常用实例方法

5.   string 的常用扩展方法

6.   string 的使用技巧

1.   什么是 string 类型

1)   它主要用于存储一组连续字符(char),一个完整的字符串对象可以看作是一个 char 类型的数组,既然是数组我们就可以把它当作集合去使用,例如:

string str1 = "abc";

char[] chars = new char[str1.Length];

//方式1

for (int i = 0; i < chars.Length; i++)

chars[i] = str1[i];

//方式2

chars = str1.ToArray();

2)   它是一种特殊的引用类型

1.   在 MSDN 上,string 就被分为引用类型,https://msdn.microsoft.com/zh-cn/library/t63sy5hs(VS.80).aspx

另外,从声明上也可以看出,它是一个密封的 class:

public sealed class String : IComparable, ICloneable, IConvertible, IComparable<string>, IEnumerable<char>, IEnumerable, IEquatable<string>

注:可见,string 实现了 IEnumerable<char> 接口,所以 string 也可以使用很多 IEnumerable<char> 接口的扩展方法。

2.   string 的值具有不变性

string 最显著的特点就是它具有恒定不变性,我们一旦创建了一个 string 对象,就不能以任何方式改变该对象的值,比如:追加、删减、改变格式等。有时看上去改变了某个字符串,但实际上则是创建了一个新的字符串实例。

3.   为什么又说它是一种特殊的引用类型呢,是因为它是引用类型,有时却表现出值类型的特点,例如:

1)   示例一

string str2 = "abc";

string str3 = str2;

str2 = "def";

Console.WriteLine("str2:{0}, str3:{1}", str2, str3);    //str2:def, str3:abc

首先,将"abc"存储在内存中,并将引用地址赋给 str2;然后,将 str2 的引用赋给 str3,此时 str2 与 str3 具有相同的引用;最后,改变了 str2 的值(注意是新值并不是改变),此时 str2 与 str3 并不是引用同一个内存地址。所以,最终输出并不相同。(个人理解)

2)   示例二(以上示例解释通了,下面的示例又做如何解释)

StringTestOne stringTestOne1 = new StringTestOne() { Name = "爱变成" };

StringTestOne stringTestOne2 = stringTestOne1;

stringTestOne2.Name = "张无忌";

Console.WriteLine("One1.Name:{0}, One2.Name:{1}", stringTestOne1.Name, stringTestOne2.Name);    //One1.Name:张无忌, One2.Name:张无忌

首先,创建了一个包含 Name 属性的对象;然后,将该对象的引用赋值给 stringTestOne2;之后,再改变了 stringTestOne2.Name 的值;结果,输出两个对象的 Name 属性,尽然是一样的值。

这样是不是有点蒙了,为什么跟上面的示例不太一样呢?我们先看引用情况:

bool bool1_1 = object.ReferenceEquals(stringTestOne1, stringTestOne2);              //true

bool bool1_2 = object.ReferenceEquals(stringTestOne1.Name, stringTestOne2.Name);    //true

没错,它们是相同的对象引用,无论是对象还是属性,都是同一个引用地址。

至此,再画张图解释一下:

讨论:http://social.msdn.microsoft.com/Forums/zh-CN/visualcshartzhchs/thread/ce580186-86d9-45f7-b5ff-20302caf1324

2.   创建 string 对象的方式

1)   直接赋值

string str5 = "abc";    //在堆中创建对象,并将引用分配给变量 str5。

2)   调用 string 的构造函数(+ 7 重载)

string str6 = new string(new char[] { ‘a‘, ‘b‘, ‘c‘ });

3.   string 的常用静态方法

1)   Compare() 方法(+ 10 重载),比较两个字符串。示例:

int int1 = string.Compare("acd", "abc");  //1

int int2 = string.Compare("123", "135");  //-1

int int3 = string.Compare("成", "成");    //0

2)   Concat() 方法(+ 10 重载),连接(串联)每个参数。示例:

string str7 = string.Concat("abc", true, 3);    //abcTrue3

3)   Join () 方法(+ 4 重载),使用指定的分隔符,连接(串联)每个参数。示例:

string str8 = string.Join(",", new int[] { 1, 2, 3 });  //1,2,3

string str9_1 = string.Join(",", new int[] { 1 });      //1

string str10_1 = string.Join(",", new int[] { });       //""

4)   Copy() 方法,将指定的字符串的值拷贝到新的字符串。示例:

string str9 = "abc123";             //abc123

string str10 = str9;                //abc123

string str11 = string.Copy(str9);   //abc123

bool bool1 = str9.Equals(str10);    //true

bool bool2 = str9.Equals(str11);    //true

bool bool3 = object.ReferenceEquals(str9, str10);   //true

bool bool4 = object.ReferenceEquals(str9, str11);   //false

注:可见,使用 Copy() 方法拷贝值的方式,与原对象的引用不同。

5)   Equals() 方法(+ 2 重载),比较两个字符串的值是否相等。示例:

string str12 = "abc123";

string str13 = "abc123";

bool bool5 = string.Equals(str12, str13);           //true

bool bool6 = object.ReferenceEquals(str12, str13);  //true

bool bool6_1 = string.Equals("a", "A", StringComparison.CurrentCulture);            //false

bool bool6_2 = string.Equals("a", "A", StringComparison.CurrentCultureIgnoreCase);  //true

注:可见,相同值的字符串对象并不会重复创建,这个很关键!

6)   Format() 方法(+ 4 重载),根据指定的格式格式化字符串。示例:

string str14 = string.Format("格式化{0}", "字符串");  //格式化字符串

//输出字符串包含“{”时,需要使用"{{"转义

string str15 = string.Format("{{格式化{0}", "字符串");  //{格式化字符串string str16_1 = string.Format("{0}{1}", "a");          //System.FormatException:索引(从零开始)必须大于或等于零,且小于参数列表的大小。

string str17_1 = string.Format("{0}{1}", "a", "b", "c");//ab

注:可见,参数列表可多不可少,多余的则忽略。

7)   IsNullOrEmpty() 方法,检查指定的字符串是否为 string.Empty 或 null。示例:

bool bool7 = string.IsNullOrEmpty("");      //true

bool bool8 = string.IsNullOrEmpty(null);    //true

bool bool9 = string.IsNullOrEmpty(" ");     //false

8)   IsNullOrEmpty() 方法,检查指定的字符串是否为 string.Empty、null 或仅由空白字符组成。示例:

bool bool10 = string.IsNullOrWhiteSpace("");    //true

bool bool11 = string.IsNullOrWhiteSpace(null);  //true

bool bool12 = string.IsNullOrWhiteSpace(" ");   //true

bool bool13 = string.IsNullOrWhiteSpace("1");   //false

4.   string 的常用实例方法

1)   CompareTo() 方法(+ 2 重载),比较两个字符串。示例:

int int4 = "acd".CompareTo("abc");  //1

int int5 = "123".CompareTo("135");  //-1

int int6 = "成".CompareTo("成");    //0

注:该方法与静态方法 CompareTo() 类似。

2)   Contains() 方法(+ 2 重载),查找此实例中是否包含指定的字符串。示例:

bool bool14 = "abc123".Contains("c1");  //true

bool bool15 = "abc123".Contains("c2");  //false

3)   StartsWith() 方法(+ 2 重载),查找此实例开头是否为指定的字符串。示例:

bool bool16 = "abc123".StartsWith("ab");    //true

bool bool17 = "abc123".StartsWith("bc");    //false

bool bool18_1 = "abc".StartsWith("abc");    //true

4)   EndsWith() 方法(+ 2 重载),查找此实例末尾是否为指定的字符串。示例:

bool bool18 = "abc123".EndsWith("23");      //true

bool bool19 = "abc123".EndsWith("12");      //false

bool bool20_1 = "abc".EndsWith("abc");      //true

5)   Equals() 方法(+ 2 重载),比较此实例是否与指定的字符串的值相等。示例:

bool bool20 = "abc123".Equals("abc123");    //true

bool bool21 = "abc123".Equals(" abc123");   //false

bool bool21_1 = "a".Equals("A", StringComparison.CurrentCulture);           //false

bool bool21_2 = "a".Equals("A", StringComparison.CurrentCultureIgnoreCase); //true

注:该方法与静态方法 Equals() 类似。

6)   GetTypeCode() 方法,获取此实例对应的 System.TypeCode 枚举值。该方法实现于 System.IConvertible 接口,所有的基础数据类型都实现了该接口。示例:

TypeCode tc1 = "123".GetTypeCode(); //TypeCode.String

7)   IndexOf() 方法(+ 8 重载),获取指定字符或字符串在此实例中【第一次】出现的索引,索引从零开始。示例:

int int7 = "abc123".IndexOf("b");   //1

8)   IndexOfAny() 方法(+ 2 重载),获取指定的字符数组的任意字符在此实例中【第一次】出现的索引,索引从零开始。示例:

int int8 = "abc123".IndexOfAny(new char[] { ‘2‘, ‘3‘, ‘1‘ });    //3

注:可见,在查找前字符数组进行了升序排序,并没有按照索引顺序匹配。

9)   LastIndexOf() 方法(+ 8 重载),获取指定字符或字符串在此实例中【最后一次】出现的索引,索引从零开始。示例:

int int9 = "abc123123".LastIndexOf("1");    //6

10)  LastIndexOfAny() 方法(+ 2 重载),获取指定的字符数组的任意字符在此实例中【最后一次】出现的索引,索引从零开始。示例:

int int10 = "abc123123".LastIndexOfAny(new char[] { ‘2‘, ‘3‘, ‘1‘ });    //8

注:可见,在查找前字符数组进行了降序排序,并没有按照索引顺序匹配。

11)  Insert() 方法,返回在此实例的指定索引处插入字符串后的新字符串,索引从零开始。示例:

string str16 = "abc123".Insert(0, "lcl");   //lclabc123

12)  PadLeft() 方法(+ 1 重载),返回在此实例的【左侧】填充指定的字符来达到指定的长度。示例:

string str17 = "abc123".PadLeft(6, ‘x‘);    //abc123

string str18 = "abc123".PadLeft(8, ‘x‘);    //xxabc123

13)  PadRight() 方法(+ 1 重载),返回在此实例的【右侧】填充指定的字符来达到指定的长度。示例:

string str19 = "abc123".PadRight(6, ‘x‘);   //abc123

string str20 = "abc123".PadRight(8, ‘x‘);   //abc123xx

14)  Remove() 方法(+ 1 重载),返回在此实例中移除指定起始位置和数量后的字符串,索引从零开始。示例:

string str21 = "abc123".Remove(3, 1);   //abc23

15)  Replace() 方法(+ 1 重载),返回此实例在指定的旧值被新值替换后的字符串。示例:

string str22 = "abc123".Replace("abc", "def");   //def123

16)  Split() 方法(+ 5 重载),返回此实例在指定的字符数组分割后的字符串数组。示例:

char[] separator = { ‘ ‘, ‘,‘ };

StringSplitOptions options = StringSplitOptions.RemoveEmptyEntries;

string[] strs1 = ",a b,c".Split(separator);             //["", "a", "b", "c"]

string[] strs2 = ",a b,c".Split(separator, options);    //["a", "b", "c"]

string[] strs3 = ",a b,c".Split(separator, 3);          //["", "a", "b,c"]

string[] strs4 = ",a b,c".Split(separator, 3, options); //["a", "b", "c"]

string[] strs5 = "abc".Split(separator, options);       //["abc"]

string[] strs6 = "".Split(separator, options);          //[]

17)  Substring() 方法(+ 1 重载),在此实例中检索指定起始位置至指定长度的子字符串。示例:

string str23 = "abc123".Substring(1);       //bc123

string str24 = "abc123".Substring(1, 2);    //bc

string str33 = "abc123".Substring(0);       //abc123

string str34 = "abc123".Substring(6);       //""

string str35 = "abc123".Substring(7);       //System.ArgumentOutOfRangeException:startIndex 不能大于字符串长度。

18)  ToCharArray() 方法(+ 1 重载),将此实例复制到字符数组中,且可指定起始位置及长度,索引从零开始。示例:

char[] chars1 = "".ToCharArray();           //[]

char[] chars2 = "abc".ToCharArray();        //[‘a‘, ‘b,‘, ‘c‘]

char[] chars3 = "abc".ToCharArray(1, 1);    //[‘b‘]

19)  ToLower() 方法(+ 1 重载),返回此实例的【小写】形式的副本。示例:

string str25 = "ABc123".ToLower();          //abc123

20)  ToUpper() 方法(+ 1 重载),返回此实例的【大写】形式的副本。示例:

string str26 = "abC123".ToUpper();          //ABC123

21)  TrimStart() 方法(+ 1 重载),移除此实例中的【前导】空格 或 匹配指定字符数组的字符。示例:

string str27 = " okakabcok ".TrimStart();               //|okakabcok |

string str28 = " okakabcok ".TrimStart(‘k‘, ‘ ‘, ‘o‘);  //|akabcok |

22)  TrimEnd() 方法(+ 1 重载),移除此实例中的【尾部】空格 或 匹配指定字符数组的字符。示例:

string str29 = " okabcakok ".TrimEnd();                 //| okabcakok|

string str30 = " okabcakok ".TrimEnd(‘k‘, ‘ ‘, ‘o‘);    //| okabca|

23)  Trim() 方法(+ 1 重载),移除此实例中的【首尾】空格 或 匹配指定字符数组的字符。示例:

string str31 = " okabcakok ".Trim();                    //|okabcakok|

string str32 = " okabcakok ".Trim(‘k‘, ‘ ‘, ‘o‘);       //|abca|

5.   string 的常用扩展方法

?  string 的扩展主要是借助了 IEnumerable<char> 接口的扩展,使用这些扩展方法之前,首先需要引入 System.Linq 命名空间。

1)   获取第一个字符

char char1 = "abc123".FirstOrDefault();     //a

2)   获取指定索引处的字符,索引从零开始

char char2 = "abc123".ElementAt(1);         //b

3)   反转字符串

string str36 = new string("abc123".Reverse().ToArray());    //321cba

4)   字符串排序

string str37 = new string("132cab".OrderBy(o => o).ToArray());              //123abc

string str38 = new string("132cab".OrderByDescending(o => o).ToArray());    //cba321

5)   去除字符串中的重复字符

string str39 = new string("abc123abc123".Distinct().ToArray()); //abc123

?  总之,IEnumerable<char> 接口的扩展方法,字符串对象都可以运用之,因为 string 就是一个 char 类型的集合,这里就不一一列举了。

6.   string 的使用技巧

1)   连接字符串

string str50 = null;

string str51 = str50 + "abc";                   //abc

string str52 = string.Format("{0}abc", str50);  //abc

2)   生成字符串

string str56 = string.Join(",", Enumerable.Range(1, 5));    //1,2,3,4,5

string str57 = string.Empty.PadLeft(5, ‘a‘);                //aaaaa

3)   获取字符串宽度

string str61 = "获取字符串宽度";

using (Graphics graphics = Graphics.FromHwnd(IntPtr.Zero))

{

int fontSize = 9;

SizeF sizeF = graphics.MeasureString(str61, new Font("宋体", fontSize));

float width = sizeF.Width;  //90.49804

}

说明:这里需要使用 System.Drawing.Graphics 类,需要另外引用 System.Drawing.dll 程序集。

注:WinForm 中还可以使用 Control 类,获取 Graphics 的实例,例如:

Graphics graphics = (new System.Windows.Forms.Control()).CreateGraphics();

4)   字符串与字节数组互转

//字符串 转为 字节数组

byte[] bytes1 = Encoding.Default.GetBytes("チ");     //[165, 193]

byte[] bytes2 = Encoding.Default.GetBytes("ル");     //[165, 235]

byte[] bytes3 = Encoding.Default.GetBytes("我");     //[206, 210]

byte[] bytes4 = Encoding.Default.GetBytes("a");     //[97]

byte[] bytes5 = Encoding.Default.GetBytes("A");     //[65]

byte[] bytes6 = Encoding.Default.GetBytes("1");     //[49]

byte[] bytes7 = Encoding.Default.GetBytes("#");     //[35]

byte[] bytes8 = Encoding.Default.GetBytes("");      //[]

byte[] bytes9 = Encoding.Default.GetBytes(" ");     //[32]

byte[] bytes10 = Encoding.Default.GetBytes(".");    //[46]

byte[] bytes11 = Encoding.Default.GetBytes("。");   //[161, 163]

byte[] bytes12 = Encoding.Default.GetBytes(",");    //[44]

byte[] bytes13 = Encoding.Default.GetBytes(",");   //[163, 172]

//字节数组 转为 字符串

string str66 = Encoding.Default.GetString(bytes3);  //我

string str67 = Encoding.Default.GetString(bytes4);  //a

5)   字符串与 Base64编码 互转

string str71 = "字符串与 Base64编码 互转";

//字符串 转为 Base64编码

byte[] byte21 = Encoding.Default.GetBytes(str71);

string str72 = Convert.ToBase64String(byte21);     //19a3+7Su0+sgQmFzZTY0seDC6yC7pdeq

//Base64编码 转为 字符串

byte[] byte22 = Convert.FromBase64String(str72);

string str73 = Encoding.Default.GetString(byte22);  //字符串与 Base64编码 互转

时间: 2024-12-22 18:34:39

C# 数据类型之 String(字符串)的相关文章

Java数据类型中String、Integer、int相互间的转换

1.Integer转换成int的方法 Integer i;  int k = i.intValue(); 即Integer.intValue(); 2.int转换成Integer int i; Integer it = new Integer(i); 3.String转换成int的方法 String str = "10";   Integer it = new Interger(str); int i = it.intValue(); 即:int i = Integer.intValu

&lt;Foundation&gt;框架 String字符串处理 连载3

<Foundation>框架 String字符串处理 //此函数为<foundationt>框架下字符串类的操作方法 //常用类的创建 //       //NSNumber的创建 //        NSNumber *str = [[NSNumberalloc] initWithInt:100]; //        NSLog(@"%@",str); //        NSNumber *str1 = [NSNumbernumberWithInt:100

python数据类型--数字、字符串

python语言是一门强类型语言,同时也是一门动态语言,能在运行期间自动检查数据的类型,所以python不用去定义变量类型. python变量赋值: a = 10 b = 100 c = list 或 a,b,c = 10,100,list Python有五个标准的数据类型: Numbers(数字) String(字符串) List(列表) Tuple(元组) Dictionary(字典) Number(数字): Python支持四种不同的数值类型: int(有符号整型) long(长整型[也可

关于C++String字符串的使用

要想使用标准C++中string类,必须要包含#include <string>// 注意是<string>,不是<string.h>或cstring,带.h的是C语言中的头文件using std::string;using std::wstring;或using namespace std; String类是不可变(final)的,对String类的任何改变,都是返回一个新的String类对象.这样的话把String类的引用传递给一个方法,该方法对String的任何改

黑马程序员----java基础--String字符串

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.String类概述 java中用String类进行描述对字符串进行了对象的封装.这样的好处是可以对字符串这种常见数据进行方便的操作.对象封装后,可以定义N多属性和行为. String类是final的,也就是说它没有子类. 二.String字符串的特点 1.字符串一旦被初始化就不可以被改变.并且存放在方法区中的常量池中. 1 class StringDemo{ 2 public static

从零开始学习前端JAVASCRIPT — 3、JavaScript基础string字符串介绍

1:字符串 JS中的任何数据类型都可以当作对象来看.所以string既是基本数据类型,又是对象. 2:声明字符串 基本数据类型:var sStr = '字符串'; 对象的方法:var oStr = new String('字符串'); //统计每个字符出现的次数,结果显示 a 2.b 1.c 2.d1,去掉重复的字符,使结果显示 abcdfgj. //var定义的变量赋值字符串以对象[]的方式访问单个字符IE8以上支持 var str="abcdafgcj"; var arr={};

java基础18 String字符串和Object类

一.String字符串 问:笔试题:new String("abc")创建了几个对象?答:两个对象,一个对象是 位于堆内存,一个对象位于字符串常量池 1 public class Demo1 { 2 public static void main(String[] args) { 3 String str1="hello"; 4 String str2="hello"; 5 String str3=new String("hello&q

Python学习-------变量和简单的数据类型(String)

1.变量命名和使用 变量命名规则:a.变量名只能包含(字母    数字   下划线),且变量不能以数字开头,例如:变量 s_1(正确),变量1_s(错误) b.变量名不能包含空格,可以使用下划线来间隔 c.变量不能以关键字和函数名来命名,例如:print d.变量名应该简短而且具有标识性.(看见变量名就知道其大概表示啥) e.避免使用容易混淆的字母和数字,例如0和1,O和I  (代码量很大的的时候,这种小错误不容易发现,尽量不要给自己挖坑) 2.简单数据类型 String字符串:python中使

String字符串的方法

String字符串在Java开发中是我们常用的一种数据类型,同时String字符串也为我们提供了大量的方法.通过一些实例的练习,我们可以对String字符串的方法有一个比较清楚的了解. 有一个字符串String s ="abcabc",这个字符串可以看成是有2个"abc"构成,即n=2,L="abc".现在要求编写一段程序,使用单例模式,输入任意字符串s,输出nL.比如:输入"bbbb",输出4b:输入abcfg,输出1abc