技术开发 频道

C#中字符串操作总结

  比较字符串相等

  Equals() 和运算符 ==

  C# 中有两种不同的相等:引用相等和值相等。值相等是大家普遍理解的意义上的相等:它意味着两个对象包含相同的值。例如,两个值为 2 的整数具有值相等性。引用相等意味着要比较的不是两个对象,而是两个对象引用,且两者引用的是同一个对象。这可以通过简单的赋值来实现,如下面的示例所示:

  System.Object a = new System.Object();

  System.Object b = a;

  System.Object.ReferenceEquals(a, b); //returns true

  在上面的代码中,只存在一个对象,但存在对该对象的多个引用:a 和 b。由于它们引用的是同一个对象,因此具有引用相等性。如果两个对象具有引用相等性,则它们也具有值相等性,但是值相等性不能保证引用相等性。

  若要检查引用相等性,应使用 ReferenceEquals。若要检查值相等性,请使用 Equals。

  运算符 ==

  对于预定义的值类型,如果操作数的值相等,则相等运算符 (==) 返回 true,否则返回false。对于string以外的引用类型,如果两个操作数引用同一个对象,则==返回true。对于string类型,==比较字符串的值

  对于内置值类型,==判断的是两个对象的代数值是否相等。它会根据需要自动进行必要的类型转换,并根据两个对象的值是否相等返回true或者false。例如:

  int x = 100;

  Double y = 100;

  if (x == y)

  Response.Write("x==y!"); //x==y

  而对于用户定义的值类型,如果没有重载==操作符,==将是不能够使用的。例如:

  Struct Userstruct1;

  Userstruct1 a;

  Userstruct1 b;

  If(a == b)

  Console.WriteLine(“can == reach this far?”)

  上面的这段代码是不能够通过编译的。可以通过重载使==作用于用户定义的值类型。

  对于引用类型,== 默认的行为与ReferenceEquals的行为相同,仅有两个对象指向同一个Reference的时候才返回true。

  Equals():

  Equals方法对于值类型和引用类型的定义不同,对于值类型,类型相同,并且数值相同(对于struct的每个成员都必须相同),则Equals返回true,否则返回false。而对于引用类型,默认的行为与ReferenceEquals的行为相同,仅有两个对象指向同一个Reference的时候才返回true。可以根据需要对Equals进行重载,例如String类的Equals用于判断两个字符串的内容是否相等。

  StringBuilder a = new StringBuilder();

  a.Append("the test a");

  String s1 = a.ToString();

  String s2 = "the test a";

  if (s2 == s1) //为真,因为S2,S1内容相等。String类的==与Equals的行为相同,判断两个字符串的内容是否相等

  Response.Write("== returns true");

  if (Object.Equals(s2, s1)) //为真,String类重载了Equals,用于判断两个字符串的内容是否相等

  {

  Response.Write("equals returns true");

  }

  if (Object.ReferenceEquals(s2, s1)) //为假,因为s2,s1并不是指向同一个对象

  {

  Response.Write("ReferenceEquals returns true");

  }

  注:对于String类,直接声明s1 = “the test a”的话,输出结果将包含 "ReferenceEquals returns true",因为默认的,String对于声明的相同的字符串在堆上只保留一个Copy,所以s1与s2将会指向相同的Reference。

  分割字符串

  Split 方法将字符串分隔后返回字符串数组。

  Split使用方法一:

  string str = "abcdefghigkceofuecto";

  string[] sArray = str.Split('c');

  foreach (string i in sArray)

  Response.Write(i.ToString()+"</br>");

  输出下面的结果:

  ab

  defghigk

  eofue

  to

  Split使用方法二:

  我们看到了结果是以一个指定的字符进行的分割。使用另一种构造方法对多个字符进行分割:

  string str = "abcdefghigkceofuecto";

  string[] sArray = str.Split(new char[3] { 'h', 'i', 'g' });

  foreach (string i in sArray)

  Response.Write(i.ToString()+"</br>");

  输出:

  abcdef

  kceofuecto

  使用正则表达式:

  使用正则表达式,可以过滤掉一些不是很规则的字符。

  string str = "everybody***************Welcome*****to***china*!";

  string[] sArray = System.Text.RegularExpressions.Regex.Split(str, @"[*]+");

  foreach (string i in sArray)

  Response.Write(i.ToString()+"</br>");

  输出:

  everybody

  Welcome

  to

  china

  !

  字符串截取

  string myString = "Hello Word!";

  //Substring()在C#中有两个重载函数

  //分别如下示例

  string subString1 = myString.Substring(0);

  //如果传入参数为一个长整, 且大于等于0,

  //则以这个长整的位置为起始,

  //截取之后余下所有作为字串.

  //如若传入值小于0,

  //系统会抛出ArgumentOutOfRange异常

  //表明参数范围出界

  string subString2 = myString.Substring(0, 5);

  //如果传入了两个长整参数,

  //前一个为参数子串在原串的起始位置

  //后一个参数为子串的长度

  //如不合条件同样出现上述异常

  Response.Write(subString1);//Hello Word!

  Response.Write(subString2);//Hello

0
相关文章