3

考虑以下代码:

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

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

    Console.ReadLine();
}

输出为“真”。string是 .Net 中的引用类型,我正在比较两个不同的对象,但输出仍然是“真”。

  1. 是因为它ToString()在比较两个对象之前在内部调用了两个对象的方法吗?
  2. 还是因为 astring是不可变类型?具有相同值的两个完全不同的 string对象将指向堆上的相同内存位置?

比较是如何string发生的?

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

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() Courtosey of Memory address of an object in C#

于 2013-08-30T01:22:49.663 回答
1

String 类已经完成了运算符重载,为==运算符编写自定义逻辑。

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

于 2013-08-30T01:26:51.660 回答
0

string 是引用类型,因为它没有默认分配大小,但出于理智的原因被视为值类型,你能否想象一个世界==在精确的字符串值之间不起作用。

于 2013-08-30T01:25:58.127 回答
0

请参阅https://stackoverflow.com/a/1659107/562036了解更多信息

很可能大部分开发人员来自 Java 背景,使用 == 比较字符串是错误的并且不起作用。在 C# 中没有(实际的)区别(对于字符串)。

于 2013-08-30T01:26:29.900 回答