请考虑以下代码:
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”。
ToString()
方法&在比较它们之前?string
是不可变类型?具有相同值的两个完全不同的 string
对象将指向堆上的相同内存位置? string
如何进行比较?
内存分配如何在堆上运行?具有相同值的两个不同string
对象是指向相同的内存位置还是指向不同的内存?
答案 0 :(得分: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
这有意义吗?
答案 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#中没有(实际)差异(对于字符串)。