-2

有没有一种可能的方法让我在不调用 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 方法所做的那样。

4

4 回答 4

3

现在回到我的问题,如何在不调用 mscorlib 中的任何函数的情况下比较 2 个字符串,就像 Equals 方法所做的那样。

你不能——至少不能从头开始编写自己的字符串比较方法。

在某些时候,您必须至少调用String.Equals(a,b)(为了调用私有EqualsHelper方法,该方法进行实际比较),这也在mscorlib.

Equals如果您希望避免接线员呼叫,您可以直接呼叫,但是:

string s1 = "hi";
if (string.Equals(s1, "bye"))
{
    Console.WriteLine("foo");
}

这将避免调用op_Equality,绕过它并Equals直接调用。

话虽这么说,确实没有理由首先避免调用op_Equality字符串......

于 2012-10-11T17:40:41.563 回答
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。

于 2012-10-11T17:47:32.217 回答
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;
    }
于 2012-10-11T17:46:03.213 回答
0

鉴于String该类是由 提供的mscorlib,因此绝对无法在不使用 的情况下比较两个字符串mscorlib。即使只是使用索引器将每个字符调用到mscorlib.

避免的唯一方法mscorlib是不使用 .Net 运行时,但如果您想使用 C#,那将非常困难。

于 2012-10-11T17:53:10.470 回答