3

次のコードを検討してください。

public static void Main()
{
    string str1 = "abc";
    string str2 = "abc";

    if (str1 == str2)
    {
        Console.WriteLine("True");
    }
    else
    {
        Console.WriteLine("False");
    }

    Console.ReadLine();
}

出力は「True」です。stringは.Netの参照型であり、2つの異なるオブジェクトを比較していますが、それでも出力は「True」です。

  1. ToString()比較する前に、両方のオブジェクトのメソッドを内部的に呼び出しているためですか?
  2. それとも astringが不変型だからですか?同じ値を持つ2 つの完全に異なる stringオブジェクトは、ヒープ上の同じメモリ位置を指しますか?

string比較はどのように行われますか?

メモリ割り当てはヒープでどのように機能しますか? string同じ値を持つ2 つの異なるオブジェクトは、同じメモリ位置を指しますか、それとも異なるメモリ位置を指しますか?

4

5 に答える 5

6
  • デフォルトでは、文字列は値によって比較されます。
  • デフォルトでは、オブジェクトは参照によって比較されます。
  • 同じアセンブリ内の同一の文字列リテラルは、同じ参照になるようにインターンされます。
  • リテラルではない同一の文字列は、合法的に同じ参照にインターンすることができますが、実際には通常そうではありません。

これで、このプログラム フラグメントで特定の出力が得られる理由を理解できるはずです。

string a1 = "a";
string a2 = "a";
string aa1 = a1 + a2;
string aa2 = a1 + a2;
object o1 = a1;
object o2 = a2;
object o3 = aa1;
object o4 = aa2;
Console.WriteLine(a1 == a2);   // True
Console.WriteLine(aa1 == aa2); // True
Console.WriteLine(o1 == o2);   // True
Console.WriteLine(o3 == o4);   // False

それは理にかなっていますか?

于 2013-08-30T04:25:12.990 に答える
5

文字列型の場合、== は文字列の値を比較します。

http://msdn.microsoft.com/en-us/library/53k8ybth.aspxを参照してください。

住所に関する質問については、数行のコードで、同じ住所になると書かれています。

static void Main(string[] args)
{
    String s1 = "hello";
    String s2 = "hello";
    String s3 = s2.Clone() as String;

    Console.Out.WriteLine(Get(s1));
    Console.Out.WriteLine(Get(s2));
    Console.Out.WriteLine(Get(s3));

    s1 = Console.In.ReadLine();
    s1 = Console.In.ReadLine();
    s3 = s2.Clone() as String;

    Console.Out.WriteLine(Get(s1));
    Console.Out.WriteLine(Get(s2));
    Console.Out.WriteLine(Get(s3));
}

public static string Get(object a)
{
    GCHandle handle = GCHandle.Alloc(a, GCHandleType.Pinned);
    IntPtr pointer = GCHandle.ToIntPtr(handle);
    handle.Free();
    return "0x" + pointer.ToString("X");
}

テストの各セットで同じアドレスになります。

Get() C# のオブジェクトのメモリ アドレスの礼儀

于 2013-08-30T01:22:49.663 に答える
1

String クラスは、演算子のカスタム ロジックを記述するために演算子のオーバーロードを実行しました==

そのため、文字列の場合に == が使用されると、参照ではなく実際の値が比較されます。

于 2013-08-30T01:26:51.660 に答える
0

文字列にはデフォルトの割り当てサイズがないため、参照型ですが、健全性の理由から値型として扱われ==ます。正確な文字列値の間で機能しない世界を想像できますか。

于 2013-08-30T01:25:58.127 に答える
0

詳細については、 https://stackoverflow.com/a/1659107/562036を参照してください。

開発者ベースの大部分は、文字列を比較するために == を使用することが間違っていて機能しない Java のバックグラウンドから来ている可能性が非常に高いです。C# には (実際的な) 違いはありません (文字列の場合)。

于 2013-08-30T01:26:29.900 に答える