9

以下のコードを見てください。

using System;
class MyClass
{
    static void Main()
    {
        object o = ".NET Framework";
        object o1 = new string(".NET Framework".ToCharArray());
        Console.WriteLine(o == o1);
        Console.WriteLine(o.Equals(o1));
    }
}

結果は次のとおりです。
False
True

そして今、これを考えてみましょう:

using System;
class MyClass
{
    static void Main()
    {
        object o = ".NET Framework";
        object o1 = ".NET Framework";
        Console.WriteLine(o == o1);
        Console.WriteLine(o.Equals(o1));
    }
}

結果は次のとおり
です

「==」はオブジェクト参照が同じかどうかを比較し、「.Equals()」は内容が同じかどうかを比較します。これらのコードの違いを知りたいですか?!

object o1 = new string(".NET Framework".ToCharArray());

object o1 = ".NET Framework"; 

どちらもオブジェクトになりますが、結果が異なるのはなぜですか?

4

3 に答える 3

15

どちらもオブジェクトになりますが、結果が異なるのはなぜですか?

o2 番目のケースでは、代入と代入の両方に同じ文字列定数を使用していますo1。C# は、同じプログラム内の 2 つの等しい文字列定数式が同じ文字列オブジェクトを参照することを保証します。したがって、oとの値o1は同じ参照です。

より一般的な形式 (定数文字列式の場合) を見つけることはできませんが、実際には C# 仕様のセクション 2.4.4 でカバーされています。

文字列等値演算子に従って等価な文字列リテラルが 2 つ以上同じプログラムにある場合、これらの文字列リテラルは同じ文字列インスタンスを参照します。

編集: の動作に関する簡単なメモ==:

  • 両方のオペランドのコンパイル時の型が の場合==、によって提供されるオーバーロードstringが使用され、内容の比較が実行されます。
  • それ以外の場合は、質問で述べたように、参照が等しいかどうかを比較するだけの「デフォルト」の実装が使用されます。

あなたの場合、オペランドのコンパイル時の型は bothobjectであるため、真に参照の等価性を使用しています。

于 2013-05-03T09:44:53.233 に答える