有没有一种可能的方法让我比较字符串而不调用op_Equality函数是mscorlib? 例如:
string s1 = "hi";
if(s1 == "bye")
{
Console.Writeline("foo");
}
编译为:
IL_0003: call bool [mscorlib]System.String::op_Equality(string, string)
从GAC查看mscorlib的op_Equality,它调用另一个方法Equals(string,string) 代码:
public static bool Equals(string a, string b)
{
return a == b || (a != null && b != null && string.EqualsHelper(a, b));
}
它使用操作码bne.une.s来比较这些字符串。
现在回到我的问题,如何在不调用mscorlib的任何函数的情况下比较2个字符串,就像Equals那样。
答案 0 :(得分:3)
现在回到我的问题,如何在不调用mscorlib的任何函数的情况下比较2个字符串,就像Equals那样。
你不能 - 至少不能从头开始编写自己的字符串比较方法。
在某些时候,你必须至少调用String.Equals(a,b)
(为了让私有的EqualsHelper
方法调用,进行实际比较),这也在{{1 }}。
如果您希望避免接听电话,可以直接拨打mscorlib
:
Equals
这样可以避免拨打string s1 = "hi";
if (string.Equals(s1, "bye"))
{
Console.WriteLine("foo");
}
,绕过它并直接拨打op_Equality
。
话虽如此,实际上没有理由避免首先在字符串上调用Equals
......
答案 1 :(得分:1)
好像你要求一个字符串比较功能。字符串基本上是字符数组,您可以以类似的方式索引。这是一个简单的字符串比较算法。
public static bool Equals(string left, string right)
{
if (ReferenceEquals(left, null)) return ReferenceEquals(right, null);
if (left.Length != right.Length) return false;
for (int i = 0; i < left.Length; i++)
{
if (left[i] != right[i])
return false;
}
return true;
}
向您展示了,没有理由避免mscorlib实现,因为我的示例多次调用mscorlib。
答案 2 :(得分:0)
这是另一种比较方式:
string s1 = "Hello";
bool same = s1.CompareTo("Hello") == 0;
bool different = s1.CompareTo("GoodBye") != 0;
Console.WriteLine(same);
Console.WriteLine(different);
在这种情况下,两者都应向控制台报告“True”。
另一种方式:
private static bool CheckEqual(string s1, string s2)
{
char[] c1 = (s1 == null) ? new char[0] : s1.ToCharArray();
char[] c2 = (s2 == null) ? new char[0] : s2.ToCharArray();
if (c1.Length != c2.Length) { return false; }
for (int i = 0; i < c1.Length; i++)
{
if (!c1[i].Equals(c2[i])) { return false; }
}
return true;
}
答案 3 :(得分:0)
鉴于String
类由mscorlib
提供,绝对无法在不使用mscorlib
的情况下比较两个字符串。即使只是使用索引器将每个字符调用到mscorlib
。
避免使用mscorlib
的唯一方法是不使用.Net运行时,但如果你想使用C#,那就很难了。