类型字符串的引用对象比较

时间:2013-08-30 01:19:52

标签: c# .net string operators

请考虑以下代码:

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&中的参考类型。我正在比较两个不同的对象,但输出仍为“True”。

  1. 是因为它在内部调用两个对象上的ToString()方法&在比较它们之前?
  2. 或者是因为string是不可变类型?具有相同值的两个完全不同的 string对象将指向堆上的相同内存位置?
  3. string如何进行比较?

    内存分配如何在堆上运行?具有相同值的两个不同string对象是指向相同的内存位置还是指向不同的内存?

5 个答案:

答案 0 :(得分:6)

  • 默认情况下,字符串按值进行比较。
  • 默认情况下,按引用比较对象。
  • 同一个程序集中相同的字符串文字 interned 是相同的参考。
  • 文字的相同字符串可以合法地插入相同的引用,但实际上通常不会。

所以现在你应该能够理解为什么你在这个程序片段中得到给定的输出:

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

这有意义吗?

答案 1 :(得分: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 {)Courtosey of Memory address of an object in C#

答案 2 :(得分:1)

String Class已完成运算符重载以为==运算符编写自定义逻辑。

这就是为什么在字符串的情况下使用==时它不会比较引用而是实际值。

答案 3 :(得分:0)

字符串是引用类型,因为它没有默认的分配大小,但出于理智的原因被视为值类型,您是否可以对==之间无法处理精确字符串值的世界进行映像。

答案 4 :(得分:0)

有关详细信息,请参阅https://stackoverflow.com/a/1659107/562036

  

很可能很大一部分开发人员都来了   从Java背景中使用==来比较字符串是错误的   不起作用。在C#中没有(实际)差异(对于字符串)。