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

C# 在比较字符串时避免调用mscorlib?,c#,mscorlib,C#,Mscorlib,有没有一种方法可以让我在不调用op_相等函数Is mscorlib的情况下比较字符串? 例如: string s1 = "hi"; if(s1 == "bye") { Console.Writeline("foo"); } 汇编至: IL_0003: call bool [mscorlib]System.String::op_Equality(string, string) 从GAC看mscorlib的op_相等,它调用另一个方法Equals(string,string) 代码: 它使用操作

有没有一种方法可以让我在不调用op_相等函数Is mscorlib的情况下比较字符串? 例如:

string s1 = "hi";
if(s1 == "bye")
{
Console.Writeline("foo");
}
汇编至:

IL_0003: call bool [mscorlib]System.String::op_Equality(string, string)
从GAC看mscorlib的op_相等,它调用另一个方法Equals(string,string) 代码:

它使用操作代码bne.une.s来比较这些字符串

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

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

如果不从头开始编写自己的字符串比较方法,您就不能——至少不能

在某些情况下,您必须至少调用
String.Equals(a,b)
(以便调用私有
EqualsHelper
方法,该方法进行实际比较),该方法也在
mscorlib
中定义

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

string s1 = "hi";
if (string.Equals(s1, "bye"))
{
    Console.WriteLine("foo");
}
这将避免调用
op_Equality
,绕过它并直接调用
Equals


话虽如此,实际上没有理由不首先对字符串调用
op_Equality

这是另一种比较方法:

        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;
    }
private static bool CheckEqual(字符串s1、字符串s2)
{
char[]c1=(s1==null)?新字符[0]:s1.tocharray();
char[]c2=(s2==null)?新字符[0]:s2.tocharray();
如果(c1.Length!=c2.Length){返回false;}
for(int i=0;i
看起来您需要一个字符串比较函数。字符串基本上是可以以类似方式索引的字符数组。下面是一个简单的字符串比较算法

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;
}
公共静态bool等于(字符串左、字符串右)
{
if(ReferenceEquals(left,null))返回ReferenceEquals(right,null);
如果(left.Length!=right.Length)返回false;
for(int i=0;i

已经向您展示了这一点,没有理由避免使用mscorlib实现,因为我的示例多次调用mscorlib。

鉴于
String
类由
mscorlib
提供,如果不使用
mscorlib
,绝对无法比较两个字符串。即使只是使用索引器将每个字符调用到
mscorlib


避免
mscorlib
的唯一方法是不使用.Net运行时,但如果要使用C#,这是相当困难的。

为什么要避免mscorlib?您可以编写自己的方法,也许可以通过迭代字符来实现。但是重点是什么呢?很可能你写的任何方法都不会像内置方法那么快。内置方法使用不安全的代码来非常有效地执行相等性检查;这将避免mscorlib。但是String.Equals方法实际上如何比较这两个字符串呢?我的意思是一定有办法。@great刚刚编辑了更多细节。它使用了一个私有方法(
string.EqualsHelper
),这也是在
mscorlib
中定义的-因为它是私有的,你不能自己调用它。我很确定
CompareTo
是由mscorlibMSDN为
CompareTo
提供的关于
0
:“这个实例在排序顺序中的位置与strB相同。”因此,它们肯定是相等的,但不能保证相等。老实说,我不确定实际的行为,但我建议你不要依赖任何没有明确说明的东西@Mudu plus,
CompareTo
的效率可能低于
Equals
。如果有不同长度的长字符串,且以相同的子字符串开头,则检查长度后Equals将立即返回false,但CompareTo必须遍历字符串,直到找到不匹配的字符。True,这并不能解决不使用mscorlib的问题,也不是比较两个字符串的最佳方法。最好的方法是尽量避免,但使用.Equals而不是==运算符,因为不管怎样,它只会落到.Equals上。@phoog-是的,我想,但是OP会问一些问题,如何避免任何与mscorlib单声道等效的程序集。这无疑是正确的。我只是想指出,有一些方法可以在不使用.NET运行时的情况下使用C。
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;
}