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方法比较的是什么
展开
 我来答
百度网友25ed0b895
推荐于2016-09-10 · TA获得超过257个赞
知道答主
回答量:128
采纳率:0%
帮助的人:0
展开全部
比较的是值。下面是用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);
}

不过确实也是逐字符比较的,比较的是值。
MXGK5299
2010-06-11 · 超过18用户采纳过TA的回答
知道答主
回答量:39
采纳率:0%
帮助的人:29万
展开全部
C#的string类型不同于其他类型,属于引用类型,如果用=比较两个string类型的变量的话,那么比较的就是内存引用地址,而不是比较值,Equals则是比较内存地址下存储的值,所以你要比较string的内容是否相等的话,就用equas("");
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式