-2

mscorlib の op_Equality 関数を呼び出さずに文字列を比較できる方法はありますか? 例えば:

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 を使用してこれらの文字列を比較します。

私の質問に戻って、Equals メソッドのように mscorlib から関数を呼び出さずに 2 つの文字列を比較するにはどうすればよいでしょうか。

4

4 に答える 4

3

私の質問に戻って、Equals メソッドのように mscorlib から関数を呼び出さずに 2 つの文字列を比較するにはどうすればよいでしょうか。

できません - 少なくとも、独自の文字列比較メソッドをゼロから作成しない限りは。

ある時点で、少なくとも を呼び出す必要があります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クラスがによって提供されることを考えると、mscorlibを使用せずに2つの文字列を比較する方法は絶対にありませんmscorlib。インデクサーを使用して各文字の呼び出しを取得するだけでもmscorlib

回避する唯一の方法mscorlibは、.Netランタイムを使用しないことですが、C#を使用する場合はかなり困難です。

于 2012-10-11T17:53:10.470 に答える
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 に答える