比较字符串相等
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