C# string类型的Equals方法
我现在有一个String类型的泛型StringList1,还有一个String类型的泛型StringList2,那么我遍历每一个stringList2的每一项foreac...
我现在有一个String类型的泛型StringList1,还有一个String类型的泛型StringList2,那么我遍历每一个stringList2的每一项
foreach(string str in stringList2)
{
if(StringList1.Contains(str))
{
//执行我的操作
}
}
我本意是想比较他们的值是否相等而不是地址,由于Contains是基于Equas写的,所以想知道string类型的Equals方法比较的是什么 展开
foreach(string str in stringList2)
{
if(StringList1.Contains(str))
{
//执行我的操作
}
}
我本意是想比较他们的值是否相等而不是地址,由于Contains是基于Equas写的,所以想知道string类型的Equals方法比较的是什么 展开
2个回答
展开全部
比较的是值。下面是用Reflector反编译出来的String类的部分源码,供参考:
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
public bool Equals(string value)
{
if ((value == null) && (this != null))
{
return false;
}
return EqualsHelper(this, value);
}
主要的是EqualsHelper这个方法的实现,具体如下:
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
private static unsafe bool EqualsHelper(string strA, string strB)
{
int length = strA.Length;
if (length != strB.Length)
{
return false;
}
fixed (char* str = ((char*) strA))
{
char* chPtr = str;
fixed (char* str2 = ((char*) strB))
{
char* chPtr2 = str2;
char* chPtr3 = chPtr;
char* chPtr4 = chPtr2;
while (length >= 10)
{
if ((((*(((int*) chPtr3)) != *(((int*) chPtr4))) || (*(((int*) (chPtr3 + 2))) != *(((int*) (chPtr4 + 2))))) || ((*(((int*) (chPtr3 + 4))) != *(((int*) (chPtr4 + 4)))) || (*(((int*) (chPtr3 + 6))) != *(((int*) (chPtr4 + 6)))))) || (*(((int*) (chPtr3 + 8))) != *(((int*) (chPtr4 + 8)))))
{
break;
}
chPtr3 += 10;
chPtr4 += 10;
length -= 10;
}
while (length > 0)
{
if (*(((int*) chPtr3)) != *(((int*) chPtr4)))
{
break;
}
chPtr3 += 2;
chPtr4 += 2;
length -= 2;
}
return (length <= 0);
}
}
}
可见比较的绝对是值,而不是引用。
比较引用的话 strA == strB就行了(其实呢,==运算符重载也是调用了下面的静态Equals方法),下面的源码就比较典型,比较引用(引用相同,值必相同)也比较值。
public static bool Equals(string a, string b)
{
return ((a == b) || (((a != null) && (b != null)) && EqualsHelper(a, b)));
}
public static bool operator ==(string a, string b)
{
return Equals(a, b);
}
不知这个回答可以否?
更正一点,Contains方法中没有用到Equals方法,源码如下:
public bool Contains(string value)
{
return (this.IndexOf(value, StringComparison.Ordinal) >= 0);
}
不过确实也是逐字符比较的,比较的是值。
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
public bool Equals(string value)
{
if ((value == null) && (this != null))
{
return false;
}
return EqualsHelper(this, value);
}
主要的是EqualsHelper这个方法的实现,具体如下:
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
private static unsafe bool EqualsHelper(string strA, string strB)
{
int length = strA.Length;
if (length != strB.Length)
{
return false;
}
fixed (char* str = ((char*) strA))
{
char* chPtr = str;
fixed (char* str2 = ((char*) strB))
{
char* chPtr2 = str2;
char* chPtr3 = chPtr;
char* chPtr4 = chPtr2;
while (length >= 10)
{
if ((((*(((int*) chPtr3)) != *(((int*) chPtr4))) || (*(((int*) (chPtr3 + 2))) != *(((int*) (chPtr4 + 2))))) || ((*(((int*) (chPtr3 + 4))) != *(((int*) (chPtr4 + 4)))) || (*(((int*) (chPtr3 + 6))) != *(((int*) (chPtr4 + 6)))))) || (*(((int*) (chPtr3 + 8))) != *(((int*) (chPtr4 + 8)))))
{
break;
}
chPtr3 += 10;
chPtr4 += 10;
length -= 10;
}
while (length > 0)
{
if (*(((int*) chPtr3)) != *(((int*) chPtr4)))
{
break;
}
chPtr3 += 2;
chPtr4 += 2;
length -= 2;
}
return (length <= 0);
}
}
}
可见比较的绝对是值,而不是引用。
比较引用的话 strA == strB就行了(其实呢,==运算符重载也是调用了下面的静态Equals方法),下面的源码就比较典型,比较引用(引用相同,值必相同)也比较值。
public static bool Equals(string a, string b)
{
return ((a == b) || (((a != null) && (b != null)) && EqualsHelper(a, b)));
}
public static bool operator ==(string a, string b)
{
return Equals(a, b);
}
不知这个回答可以否?
更正一点,Contains方法中没有用到Equals方法,源码如下:
public bool Contains(string value)
{
return (this.IndexOf(value, StringComparison.Ordinal) >= 0);
}
不过确实也是逐字符比较的,比较的是值。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询