在比较字符串时避免调用mscorlib?

时间:2012-10-11 17:37:28

标签: c# mscorlib

有没有一种可能的方法让我比较字符串而不调用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 个答案:

答案 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#,那就很难了。